#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)