来自CSV的Python列表匹配

时间:2016-12-20 12:52:52

标签: python list dictionary

我是一名使用Python的初学者而且我被卡住了。

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

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

价值说明:[项目编号,项目,项目成本,项目库存]

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

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

我需要将List_2中02的第1个值与List_1中的项目编号匹配,即第1个项目。然后检索他归因于费用,在此示例中为2。

我希望这是有道理的。我尝试了几次不同的语法等,并且悲惨地失败了。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

不是一个非常pythonic的解决方案,但我认为这应该使逻辑清晰:

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

答案 2 :(得分: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'}}