Возвращает списки, указывающие диапазон дат

#python #matrix

#python #матрица

Вопрос:

У меня есть список в текстовом файле, подобный этому:

 Series;Type;Year;Ranking
Chernobyl;Drama;2019;9.4
True Detective;Crime;2014;9.0
Fargo;Crime;2014;8.9
Friends;Comedy;1994;8.9
When They See Us;Drama;2019;8.9
Stranger Things;Drama;2016;8.8
Black Mirror;Drama;2011;8.8
 

Мне удалось прочитать содержимое и вставить их в 2d-список со следующим кодом:

 f = open("Series_Ranking.txt", "r")
lines = f.readlines()
f.close()
for line in lines:
    Series.append(line.split(";"))
 

Который возвращает это:

 [['Series', 'Type', 'Year', 'Ranking'], ['Chernobyl', 'Drama', '2019', '9.4n'], ['True Detective', 'Crime', '2014', '9.0n'], ['Fargo', 'Crime', '2014', '8.9n'], ['Friends', 'Comedy', '1994', '8.9n'], ['When They See Us', 'Drama', '2019', '8.9n'], ['Stranger Things', 'Drama', '2016', '8.8n'], ['Black Mirror', 'Drama', '2011', '8.8n']]
 

Сейчас я пытаюсь отфильтровать список, указывающий определенный диапазон.
Например, печатайте только серии года между 2014 и 2019 годами.

Ответ №1:

Вы можете попробовать понимание списка:

 all_series = [['Chernobyl', 'Drama', '2019', '9.4n'], ['True Detective', 'Crime', '2014', '9.0n'], ['Fargo', 'Crime', '2014', '8.9n'], ['Friends', 'Comedy', '1994', '8.9n'], ['When They See Us', 'Drama', '2019', '8.9n'], ['Stranger Things', 'Drama', '2016', '8.8n'], ['Black Mirror', 'Drama', '2011', '8.8n']]
filtered = [n for n in all_series if int(n[2]) <= 2019 and int(n[2]) >= 2014]
print(filtered)
 

При этом будет распечатан отфильтрованный список, содержащий только серии, которые были выпущены до или в 2019 году и после или в 2014 году.

Вы можете перебирать список, содержащий все серии. Но это будет работать только в том случае, если первого списка там нет, ['Series', 'Type', etc...]

Вы также можете проверить, соответствует ли год вашим критериям, а затем добавить его как таковой:

 f = open("Series_Ranking.txt", "r")
lines = f.readlines()
f.close()
for line in range(1, len(lines)):
    if int(lines[line][2]) <= 2019 and int(lines[line][2]) >= 2014:
        Series.append(lines[line].split(";"))
 

Здесь я использовал Len() вместо того, чтобы просто перебирать список, чтобы пропустить первый список, который является метками.

Комментарии:

1. С вашим последним кодом я получаю сообщение об ошибке TypeError: объект ‘int’ не подлежит подписке

2. @R.Teixeira Я исправил ошибку. Я попытался индексировать переменную вместо списка lists по индексу list . Код в вопросе теперь должен работать

Ответ №2:

Если вы хотите отфильтровать, вы можете использовать filter функцию!

 series = [['Series', 'Type', 'Year', 'Ranking'], ['Chernobyl', 'Drama', '2019', '9.4n'], ['True Detective', 'Crime', '2014', '9.0n'], ['Fargo', 'Crime', '2014', '8.9n'], ['Friends', 'Comedy', '1994', '8.9n'], ['When They See Us', 'Drama', '2019', '8.9n'], ['Stranger Things', 'Drama', '2016', '8.8n'], ['Black Mirror', 'Drama', '2011', '8.8n']]
criteria = lambda show: int(show[2]) >= 2014 and int(show[2]) <= 2019
filtered = filter(criteria, series[1:])
print(filtered)
 

С принтами:

 [['Chernobyl', 'Drama', '2019', '9.4n'], ['True Detective', 'Crime', '2014', '9.0n'], ['Fargo', 'Crime', '2014', '8.9n'], ['When They See Us', 'Drama', '2019', '8.9n'], ['Stranger Things', 'Drama', '2016', '8.8n']]
 

Если бы данные были немного чище, тогда заголовок не был бы первым элементом в списке, годы не были бы строками, а элементы могли бы быть namedtuple s вместо list s . В этом случае вы могли бы вместо этого написать следующее:

 criteria = lambda show: show.year >= 2014 and show.year <= 2019
filtered = filter(criteria, series)