Как отфильтровать неизвестный элемент в списке python - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь создать программу, в которой указаны сокращения дней недели (понедельник, вторник, ср. И т. Д. c.), Которые заменяются полными словами (понедельник, вторник, среда). Программа создает список, полный строк, и выводит его в виде строки. У меня это работает, за исключением случаев, когда используется что-то, что не день недели. Например, слово, которое не Mon, Tue, Wed et c. (Как видно из кода) Я хочу иметь возможность отфильтровывать нежелательные слова, но не знаю как. Пожалуйста, помогите.

Код:

days = []

def format_days(days): 

  days = [d.replace('Mon', 'Monday') for d in days]
  days = [d.replace('Tue', 'Tuesday') for d in days]
  days = [d.replace('Wed', 'Wednesday') for d in days]
  days = [d.replace('Thu', 'Thursday') for d in days]
  days = [d.replace('Fri', 'Friday') for d in days]
  days = [d.replace('Sat', 'Saturday') for d in days]
  days = [d.replace('Sun', 'Sunday') for d in days]


  return days

answer = format_days(['Sat', 'Fun', 'Tue', 'Thu'])
print(answer)

# ['Saturday', 'Fun', 'Tuesday', 'Thursday'] <-- This is the output

# ['Saturday', 'Tuesday', 'Thursday'] <-- This is the output I want

Я хочу иметь возможность отфильтровывать «веселье» из списка, но код должен работать для всего, что не: Пн, Вт, ср, чт, пт, сб, вс не просто «весело»

Ответы [ 5 ]

3 голосов
/ 16 марта 2020

Я бы предложил вам другой подход к этому. Начните с определения словаря, сопоставляющего три первые буквы дня со всем именем:

days_of_week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
d = {day[:3]:day for day in days_of_week}

print(d)

{'Mon': 'Monday',
 'Tue': 'Tuesday',
 'Wed': 'Wednesday',
 'Thu': 'Thursday',
 'Fri': 'Friday',
 'Sat': 'Saturday',
 'Sun': 'Sunday'}

И используйте понимание списка с условным оператором, чтобы ничего не возвращалось, если данный случай не найден в словарь:

[d.get(i) for i in ['Sat', 'Fun', 'Tue', 'Thu'] if i in d]
# ['Saturday', 'Tuesday', 'Thursday']
2 голосов
/ 16 марта 2020

Добавляя к другим ответам, вы также можете использовать функции calendar day_name и day_abbr до zip() сокращения дня и полные названия дней недели:

from calendar import day_abbr, day_name

day_map = dict(zip(day_abbr, day_name))

days = ['Mon', 'Wed', 'Fri', 'Sat']

print([day_map[d] for d in days if d in days])
# ['Monday', 'Wednesday', 'Friday', 'Saturday']

Это полезно, потому что вам не нужно создавать дневник самостоятельно.

2 голосов
/ 16 марта 2020

Вы можете составить словарь из допустимых слов. Если встречается что-либо, кроме действительного дня, оно игнорируется.

def fromat_days(days):
    valid_days={'Mon':'Monday',
                'Tue':'Tuesday',
                 ...
                'Sun':'Sunday'}
    return [valid_days[day] for day in days if day in valid_days]
1 голос
/ 16 марта 2020

Вы можете начать с сопоставления сокращений до полных имен, а затем заменить только в том случае, если в сопоставлении присутствует сокращение:

map_to_names = {'Mon': 'Monday', 'Tue': 'Tuesday', ..., 'Sun': 'Sunday'}
result = [map_to_names[s] for s in days if s in map_to_names]
0 голосов
/ 16 марта 2020

Вы можете сохранить в диктовке отображение между тремя первыми символами и днем:

w_day = {'Mon': 'Monday',
 'Tue': 'Tuesday',
 'Wed': 'Wednesday',
 'Thu': 'Thursday',
 'Fri': 'Friday',
 'Sat': 'Saturday',
 'Sun': 'Sunday'}

def format_days(days): 
    return list(filter(None, map(w_day.get, days)))

format_days(['Sat', 'Fun', 'Tue', 'Thu'])

вывод:

['Saturday', 'Tuesday', 'Thursday']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...