python-3.x - 成对的数成组
问题描述
我有一个包含两列数字数据的 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 更快地完成这项工作,但目前找不到正确的命令或解决方案。指导表示赞赏。
解决方案
您可能希望从文件中逐行收集数据并将其存储在字典中,其中第一个数字作为键,列表作为值。键的相同值附加到其列表中:
# 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)
推荐阅读
- stanford-nlp - CRFClassifier:从流中加载模型给出异常“无效的流标头:1F8B0800”
- oracle - 从数组插入数据时如何解决Oracle下标超出计数错误?
- php - Php copy:无效参数错误仅在while循环内部并为最后一条记录工作
- git - 带有所有分支/标签的远程 git 存储库的完整本地副本
- jquery - 如何使用 .promise() 以便在我的函数中使用 $.when().done() ?
- swift - 元组作为函数参数给出“发送的无法识别的选择器...”
- java - 使用泛型匹配参数和返回类型
- amazon-web-services - AWS 灾难恢复以及备份和存储
- java - Java 逐行解析
- javascript - ajax 方法 post 发送到 mysql 查询