#python
#python
Вопрос:
У меня есть два списка: file_name = ['AC30 775002 secondary 2.jpg', 'AC30 775002 primary.jpg', 'AX-5 200998 primary.jpg', 'AX-5 200998 secondary 2.jpg', 'CJ19 244082 Primary.jpg']
number = ['775002', '200998', '244082']
Я пытаюсь добавить в список number
соответствующую строку, которую я нахожу в списке file_name
, чтобы она стала:
number = [['775002', 'AC30 775002 secondary 2.jpg', 'AC30 775002 primary.jpg'], ['200998', 'AX-5 200998 primary.jpg', 'AX-5 200998 secondary 2.jpg'], ['244082', 'CJ19 244082 Primary.jpg']]
Эти списки извлекаются из файлов singular column .csv, поэтому я также хочу экспортировать его в формат, читаемый в Excel, для работы в базе данных.
Это то, что у меня есть до сих пор:
with open('file_name.csv', newline='') as csvfile:
file_name = list(csv.reader(csvfile))
with open('number.csv', newline='') as csvfile:
number = list(csv.reader(csvfile))
for i in number:
matching = [s for s in file_name if number[i] in s]
number[i].append(matching)```
Комментарии:
1. Вам следует рассмотреть словарь, ключами которого являются
'775002'
,'200998'
и т.д., а значениями —['AC30 775002 secondary 2.jpg', 'AC30 775002 primary.jpg']
и['AX-5 200998 primary.jpg', 'AX-5 200998 secondary 2.jpg']
соответственно, чтобы каждое число отображалось в список соответствующих имен файлов.2. @jarmod если вы имеете в виду базу данных, это именно то, что я намерен сделать, используя элементы в «числах» в качестве моего первичного ключа. Я все еще нахожусь на этапе очистки данных.
3. Но
numbers
они повторяются для разных имен файлов.4. @Ketan с точки зрения электронной таблицы, да. Для каждого «числа» у меня будет строка, а «имя_файла» будет иметь свои собственные столбцы (если есть разные совпадающие имена файлов).
5. Я говорю, что попытка создать
number
список с такими значениями, как['775002', 'AC30 775002 secondary 2.jpg', 'AC30 775002 primary.jpg']
. Здесь вы смешиваете ключи (775002) и значения (совпадающие имена файлов). Вместо этого просто используйте dict, ключами которого являются числа, а соответствующими значениями — список имен файлов, соответствующих числовому ключу. Это имеет больше смысла и будет более полезным позже.
Ответ №1:
Проблема в том, что вы изменяете список во время его итерации. Никогда не было хорошей идеей, плюс вы получаете доступ number[i]
, как если бы вы выполняли итерацию с диапазоном. Это можно легко сделать, используя понимание
file_name = ['AC30 775002 secondary 2.jpg', 'AC30 775002 primary.jpg', 'AX-5 200998 primary.jpg', 'AX-5 200998 secondary 2.jpg', 'CJ19 244082 Primary.jpg']
number = ['775002', '200998', '244082']
all_matches = [[i] [s for s in file_name if i in s] for i in number]
[['775002', 'AC30 775002 secondary 2.jpg', 'AC30 775002 primary.jpg'], ['200998', 'AX-5 200998 primary.jpg', 'AX-5 200998 secondary 2.jpg'], ['244082', 'CJ19 244082 Primary.jpg']]
Или использовать более подходящий тип данных ( dict
)
all_matches = {i: [s for s in file_name if i in s] for i in number}
{'775002': ['AC30 775002 secondary 2.jpg', 'AC30 775002 primary.jpg'], '200998': ['AX-5 200998 primary.jpg', 'AX-5 200998 secondary 2.jpg'], '244082': ['CJ19 244082 Primary.jpg']}
Комментарии:
1. Я думаю, что код теперь работает так, как я изначально планировал. Теперь, чтобы правильно экспортировать это в файл .csv в форме:
all_matches[n][0]
,all_matches[n][1]
, и «all_matches[n] [2], имеющие свои собственные столбцы
Ответ №2:
Вы могли бы хранить все в dict
with open('file_name.csv', newline='') as csvfile:
file_names = [line.split()[0] for line in csvfile]
with open('number.csv', newline='') as csvfile:
numbers = [line.split()[0] for line in csvfile]
newdict = {}
for file_name in file_names:
for number in numbers:
if not number in newdict:
newdict[number] = []
if number in file_name:
newdict[number].append(file_name)
вывод:
{'775002': ['AC30 775002 secondary 2.jpg', 'AC30 775002 primary.jpg'], '200998': ['AX-5 200998 primary.jpg', 'AX-5 200998 secondary 2.jpg'], '244082': ['CJ19 244082 Primary.jpg']}
Комментарии:
1. Не
collections.defaultdict
было бы здесь более полезным?2. Я получаю сообщение об ошибке unhashable type ‘list’, поскольку я не могу использовать список в качестве ключа в dict.
3. Обратите внимание, что
file_name
переменная изменяется наfile_names
иnumber
наnumbers
, чтобы сделать вложенный цикл for лучше читаемым.4. @MitchellOlislagers да, я заметил. Ваш опубликованный код работает, но я извлекаю два своих списка из двух файлов .csv, поэтому я получаю эту ошибку.