从CSV进行Python列表匹配

从CSV进行Python列表匹配,python,list,dictionary,Python,List,Dictionary,我是一个使用Python的初学者,我被卡住了 我从两个单独的CSV文件中导入了一些数据,并将它们添加到相关变量中: List_1 = [['01', 'Banana', '2', '10'],['02', 'Apple', '1', '10'], ['03', 'Orange', '3', '10']] 价值解释:[项目编号、项目、项目成本、项目库存] 价值说明:[项目编号、支付金额] 我需要将列表_2中的第一个值(即02)与List_1中的项目编号(即第一个项目)匹配。然

我是一个使用Python的初学者,我被卡住了

我从两个单独的CSV文件中导入了一些数据,并将它们添加到相关变量中:

List_1 = [['01', 'Banana', '2', '10'],['02', 'Apple', '1', '10'],
          ['03', 'Orange', '3', '10']]
价值解释:[项目编号、项目、项目成本、项目库存]

价值说明:[项目编号、支付金额]

我需要将列表_2中的第一个值(即02)与
List_1
中的项目编号(即第一个项目)匹配。然后检索属性成本,在本例2中


我希望这是有道理的。我尝试过几次不同的语法等等,但都失败了

这不是一个非常符合python的解决方案,但我认为这应该让逻辑变得清晰:

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

您可以构建两个词典:

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

最好的解决方案是在读取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',)}
请注意,在数据不变的情况下,使用元组比使用列表更好。但是,如果需要通过追加、插入或删除其他数据来更改值,则需要使用列表

如果您想遵循Mike的想法,将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'}}

您是否尝试过使用
dict
而不是
list
键是您的项目编号,
值是当前列表中的其余项目。按键匹配会很容易。我会尝试一下,谢谢。我可以从我已有的列表中创建一本词典吗?@JAM,是的,你可以。你可能想检查听写理解,看看这个……在你的
打印后,你需要一个
中断
,这样一旦你找到了匹配项,你就不会继续查找,直到两个列表都用尽为止。我认为您的解决方案是“pythonic”的,因为您正在表达优秀的python代码。但是,这是低效的,因为您需要遍历两个列表才能找到匹配项。在最坏的情况下,匹配将是最后一个元素。对于长列表,此算法会很慢。
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'}}