Как мне добавить соответствующий элемент из списка в другой список?

#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, поэтому я получаю эту ошибку.