2016-12-20 2 views
2

Я начинаю использовать Python, и я застрял.Список подбора Python из CSV

Я импортировал некоторые данные из двух отдельных файлов CSV и добавил их к соответствующим переменным:

List_1 = [['01', 'Banana', '2', '10'],['02', 'Apple', '1', '10'], 
      ['03', 'Orange', '3', '10']] 

Объяснения значений: [пункт номер, пункт, стоимость товара, товар акция]

List_2 = [['02','3'],['01','1'],['03','5']] 

Объяснение значений: [номер товара, Уплаченная сумма]

Мне нужно сопоставить 1-е значение в List_2 i.e 02 с номером позиции в List_1. I. 1-й элемент. Затем извлеките его стоимость, в этом примере 2.

Надеюсь, это имеет смысл. Я пробовал несколько раз с различным синтаксисом и т. Д., И неудачно провалился.

+0

Вы пытались использовать 'dict' вместо' list'? «Ключ» будет вашим * Item number *, а 'value', остальными элементами в ваших текущих списках. Согласование их по клавишам было бы легким. – chapelo

+0

Я попробую, спасибо. – JAM

+0

Могу ли я создать словарь из списков, которые у меня уже есть? – JAM

ответ

1

Вы можете построить два словаря:

items = {entry[0]: {'item': entry[1], 'cost': float(entry[2]), 'stock': int(entry[3])} 
     for entry in List_1} 
paid = {id_: int(count) for id_, count in List_2} 

и теперь могут соответствовать как наборы данных:

for id_, count in paid.items(): 
    item = items[id_] 
    print(item['item'], item['cost'] * count) 

Выход:

Banana 2.0 
Apple 3.0 
Orange 15.0 
0

Не очень вещий решение, но я думаю, что это должно сделать логику разъясняя:

for l2 in List_2: 
    for l1 in List_1: 
     if l2[0] == l1[0]: 
      print("cost for {} is: {}".format(l1[1], l1[2])) 
+1

Вам понадобится 'break' после вашего' print', так что, как только вы найдете вы не будете продолжать смотреть, пока оба списка не исчерпаны. Я думаю, что ваше решение является «pythonic» в том смысле, что вы выражаете хороший код python. Однако это неэффективно, потому что вам нужно пройти оба списка, чтобы найти совпадение. В худшем случае совпадение будет последним элементом. Этот алгоритм будет медленным с длинными списками. – chapelo

0

Лучшим решением было бы создать словари во время чтения файла CSV и в то же время изменить данные из строки на соответствующий тип (float или int).

Если вы хотите, чтобы преобразовать существующие списки dicts, и вы используете Python 3, вы можете сделать это следующим образом:

D = lambda L: {k: tuple(v) for k, *v in L} 

D1 = D(List_1) 
D2 = D(List_2) 

print(D1) 
# {'02': ('Apple', '1', '10'), '01': ('Banana', '2', '10'), '03': ('Orange', '3', '10')} 

print(D2) 
# {'01': ('1',), '02': ('3',), '03': ('5',)} 

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

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

D = lambda L, fields: {k: dict(zip(fields, v)) for k, *v in L} 

D1 = D(List_1, ('item', 'cost', 'stock')) 
D2 = D(List_2, ('paid',)) 

print(D1) 
# {'02': {'cost': '1', 'stock': '10', 'item': 'Apple'}, '01': {'cost': '2', 'stock': '10', 'item': 'Banana'}, '03': {'cost': '3', 'stock': '10', 'item': 'Orange'}} 

print(D2) 
# {'01': {'paid': '1'}, '02': {'paid': '3'}, '03': {'paid': '5'}} 
Смежные вопросы