首页 > 解决方案 > 成对的数成组

问题描述

我有一个包含两列数字数据的 CSV,它们代表“匹配良好”(例如 1 与 3 匹配,1 与 70 匹配,2 与 16 匹配)

我想产生如下良好匹配的数组。

Ex data:
    [1,3]
    [1,70]
    [2,16]
    [2,14]
    [2,24]
    [3,42]
    [3,23]

Ex output:
    [1,3,70]
    [2, 16, 14, 24]
    [3, 42, 23]

我猜来自 itertools 的东西会比 if 或 else 更快地完成这项工作,但目前找不到正确的命令或解决方案。指导表示赞赏。

标签: python-3.x

解决方案


您可能希望从文件中逐行收集数据并将其存储在字典中,其中第一个数字作为键,列表作为值。键的相同值附加到其列表中:

# create demodata
with open("f.txt","w") as f:
    f.write("1,3\n1,70\n2,16\n2,14\n2,24\n3,42\n3,23\n")

# process demodata
from collections import defaultdict

d = defaultdict(list)

with open("f.txt") as f:
    for line in f:
        if line.strip():
            k,v = map(int,line.split(","))
            d[k].append(v)

for key,values in d.items():
    print(key, values)

l = [ [k]+v for k,v in d.items()]
print(l) 

输出:

# dictionary
1 [3, 70]
2 [16, 14, 24]
3 [42, 23]

# constructed lists from dict   
[[1, 3, 70], [2, 16, 14, 24], [3, 42, 23]]

您可以从字典中构建您想要的列表。

你可以在不导入 defaultdict 的情况下做同样的事情,它会慢一点:

d = {}

# same as above but replace d[k].append(v) with
d.setdefault(k,[]).append(v) 

推荐阅读