2010-11-02 27 views
10

Nhiệm vụ của tôi là xác định hàm weekdays(weekday) trả về danh sách các ngày trong tuần, bắt đầu từ ngày trong tuần. Nó sẽ làm việc như thế này:Trả lại danh sách các ngày trong tuần

>>> weekdays('Wednesday') 
['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday'] 

Cho đến nay tôi đã đi lên với điều này một:

def weekdays(weekday): 
    days = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 
      'Sunday') 
    result = "" 
    for day in days: 
     if day == weekday: 
      result += day 
    return result 

Nhưng điều này sẽ in chỉ trong ngày đầu vào:

>>> weekdays("Sunday") 
'Sunday' 

Tôi đang làm gì sai rồi?

Trả lời

3
def weekdays(day): 
    days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] 
    i=days.index(day) # get the index of the selected day 
    d1=days[i:] #get the list from an including this index 
    d1.extend(days[:i]) # append the list form the beginning to this index 
    return d1 

Và nếu bạn muốn kiểm tra rằng nó hoạt động:

def test_weekdays(): 
    days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] 
    for day in days: 
     print weekdays(day) 
+0

giải pháp tốt và đơn giản) – Gusto

1

Mỗi khi bạn chạy vòng lặp for, biến ngày sẽ thay đổi. Vì vậy, ngày bằng với đầu vào của bạn chỉ một lần. Sử dụng "Sunday" làm đầu vào, đầu tiên nó kiểm tra nếu thứ hai = chủ nhật, sau đó nếu thứ ba = chủ nhật, sau đó nếu thứ tư = chủ nhật, cho đến khi nó cuối cùng thấy rằng chủ nhật = chủ nhật và trả lại chủ nhật.

4

Hmm, bạn đang tìm kiếm chỉ cho các ngày trong tuần nhất định và thiết lập như là kết quả :) Bạn có thể sử dụng khả năng slice trong danh sách python để làm điều này:

result = days[days.index(weekday):] + days[:days.index(weekdays)] 
+0

ý tưởng tốt - về cơ bản chỉ tròn xoay 'danh sách days' để các yêu cầu 'weekday' là kết quả đầu tiên. Sẽ tốt hơn nếu chỉ cần tìm chỉ mục một lần, tuy nhiên, chỉ có vậy sẽ có hai dòng. (Ngoài ra, có một lỗi đánh máy, 'các ngày trong tuần 'ở cuối sẽ chỉ là' ngày trong tuần'). – martineau

4

Dưới đây là hơn những gì bạn muốn:

def weekdays(weekday): 
    days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] 
    index = days.index(weekday) 
    return (days + days)[index:index+7] 
+0

chính xác, những gì tôi nghĩ về :) – st0le

10

Cách tiếp cận nhanh hơn rất nhiều để ghi nhớ rằng các ngày trong tuần chu kỳ. Như vậy, chúng ta chỉ cần lấy ngày đầu tiên chúng ta muốn bao gồm danh sách và thêm 6 phần tử còn lại vào cuối. Hay nói cách khác, chúng tôi nhận được danh sách các ngày trong tuần bắt đầu từ ngày bắt đầu, nối thêm một tuần khác và chỉ trả lại 7 phần tử đầu tiên (cho cả tuần).

days = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday') 
def weekdays (weekday): 
    index = days.index(weekday) 
    return list(days[index:] + days)[:7] 

>>> weekdays('Wednesday') 
['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday'] 
+0

Nên là i = days.index (ngày trong tuần) – ncray

+0

@ncray: Ugh, cảm ơn, đã không nhận thấy rằng có một sự khác biệt đặt tên giữa hai phiên bản của tôi! – poke

0

biến result của bạn là một chuỗi và không phải là một đối tượng danh sách. Ngoài ra, như những người khác đã đề cập, nó chỉ được cập nhật một thời gian mà là khi nó là bằng đối số weekday được thông qua.

Một thực hiện:

import calendar 

def weekdays(weekday): 
    days = [day for day in calendar.day_name] 
    for day in days: 
     days.insert(0, days.pop()) # add last day as new first day of list   
     if days[0] == weekday:  # if new first day same as weekday then all done 
      break  
    return days 
14

Lý do mã của bạn chỉ trở về một cái tên ngày là vì weekday sẽ không bao giờ phù hợp với nhiều hơn một chuỗi trong days tuple và do đó sẽ không thêm bất kỳ của những ngày của tuần làm theo nó (cũng không quấn quanh những người trước đó). Ngay cả khi nó đã làm bằng cách nào đó, nó sẽ vẫn trả lại tất cả chúng như là một chuỗi dài bởi vì bạn đang khởi tạo result đến một chuỗi rỗng, không phải là trống list.

Đây là giải pháp sử dụng mô-đun datetime để tạo danh sách tất cả tên ngày trong tuần bắt đầu bằng "Thứ hai" bằng ngôn ngữ của ngôn ngữ hiện tại. Danh sách này sau đó được sử dụng để tạo một danh sách tên khác theo thứ tự mong muốn được trả về. Nó thực hiện thứ tự bằng cách tìm chỉ mục của ngày được chỉ định trong danh sách ban đầu và sau đó ghép hai lát của nó tương ứng với chỉ mục đó để tạo thành kết quả. Khi tối ưu hóa nó cũng lưu trữ tên ngày của miền địa phương để nếu nó được gọi lại với cùng một ngôn ngữ hiện tại (một kịch bản có khả năng), nó sẽ không cần phải tạo lại danh sách riêng tư này.

import datetime 
import locale 

def weekdays(weekday): 
    current_locale = locale.getlocale() 
    if current_locale not in weekdays._days_cache: 
     # Add day names from a reference date, Monday 2001-Jan-1 to cache. 
     weekdays._days_cache[current_locale] = [ 
      datetime.date(2001, 1, i).strftime('%A') for i in range(1, 8)] 
    days = weekdays._days_cache[current_locale] 
    index = days.index(weekday) 
    return days[index:] + days[:index] 

weekdays._days_cache = {} # initialize cache 

print(weekdays('Wednesday')) 
# ['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday'] 

Bên cạnh đó không cần phải mã hóa cứng ngày tên trong hàm, một lợi thế để sử dụng các mô-đun datetime là mã sử dụng nó sẽ tự động làm việc trong các ngôn ngữ khác. Điều này có thể được minh họa bằng cách thay đổi ngôn ngữ và sau đó gọi hàm bằng tên ngày theo ngôn ngữ tương ứng.

Ví dụ: mặc dù Pháp không phải là ngôn ngữ mặc định của tôi, tôi có thể đặt ngôn ngữ đó là ngôn ngữ hiện tại cho mục đích thử nghiệm như được hiển thị bên dưới. Lưu ý: Theo bài viết Capitalization of day names này, tên của các ngày trong tuần không được viết hoa bằng tiếng Pháp giống như ngôn ngữ mặc định của tiếng Anh, nhưng cũng được tính đến tự động, có nghĩa là tên weekday được chuyển đến bằng ngôn ngữ của ngôn ngữ hiện tại và cũng phân biệt chữ hoa chữ thường. Tất nhiên bạn có thể sửa đổi chức năng để bỏ qua chữ cái của đối số đầu vào, nếu muốn.

# set or change locale 
locale.setlocale(locale.LC_ALL, 'french_france') 

print(weekdays('mercredi')) # use French equivalent of 'Wednesday' 
# ['mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche', 'lundi', 'mardi'] 
+0

thaks cho đoạn mã này, cách bạn nhận được ngày: *** 'days = [datetime.date (2001, 1, i) .ndftime ('% A') cho i trong phạm vi (1 , 8)] '*** – andi

+1

Dòng mã đó tạo ra một danh sách tên của tất cả các ngày trong tuần bằng cách gọi' datetime.date.strftime ('% A') '7 lần bắt đầu từ một ngày được biết đến là thứ hai. Làm theo cách đó có nghĩa là không cần thiết phải đặt tên các ngày trong tuần cứng vào mã và do đó nó trở thành miền địa phương độc lập vì hàm được gọi là. – martineau

0

Một cách tiếp cận sử dụng thư viện tiêu chuẩn:

days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 
     'Sunday'] 
def weekdays(weekday): 
    n = days.index(weekday) 
    return list(itertools.islice(itertools.cycle(days), n, n + 7)) 

Itertools là một chút nhiều trong trường hợp này. Vì bạn biết ít nhất một chu kỳ bổ sung là cần thiết, bạn có thể làm điều đó bằng tay:

days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 
     'Sunday'] 
days += days 
def weekdays(weekday): 
    n = days.index(weekday) 
    return days[n:n+7] 

Cả hai cung cấp cho các đầu ra mong đợi:

>>> weekdays("Wednesday") 
['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday'] 
>>> weekdays("Sunday") 
['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] 
>>> weekdays("Monday") 
['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] 
2

Bạn không cần phải hardcode mảng của các ngày trong tuần. Nó đã có sẵn trong calendar module.

import calendar as cal 

def weekdays(weekday): 
    start = [d for d in cal.day_name].index(weekday) 
    return [cal.day_name[(i+start) % 7] for i in range(7)] 
1

Không ai đã xác đặt ra gì (Tôi nghĩ) là giải pháp nhanh nhất là:

def weekdays(weekday): 
    x = days.index(weekday) 
    return days[x:] + days[:x] 

Ít cuộc gọi, chỉ sử dụng .index() một lần, và cắt một cách hiệu quả làm cho này gần gấp đôi càng nhanh càng tốt Poke's answer.

Một lựa chọn khác có thể được sử dụng collections.deque, mà là chậm hơn so với phương pháp đầu tiên, nhưng gọn gàng trong khả năng của mình để rotate():

from collections import deque 
def weekdays(weekday): 
    x = deque(days) 
    x.rotate(-days.index(weekday)) 
    return list(x) 
Các vấn đề liên quan