假设我们有一个像这样的数据集:
a: 1,2,3,5,6
b: 4,1,2
c: 1,4
现在我们要将这个数据集转换为:
1: a,b,c
2: a,b
3: a
4: b,c
5: a
6: a
可以通过字典来完成此转换,但是有一种方法可以更有效地完成此操作
目前我的工作如下:
uFile = open("t/u.txt","r")
uDic = dict()
for cnt1, line in enumerate(uFile):
lineAr = line.strip().split(' ')
for item in lineAr:
if item not in uDic.keys():
uDic[item] = []
uDic[item].append(cnt1)
然后保存输出。
答案 0 :(得分:3)
为此使用defaultdict:
from collections import defaultdict
d = {'a': [1, 2, 3, 5, 6], 'b': [4, 1, 2], 'c': [1, 4]}
o = defaultdict(list)
for k, v in d.items():
for vv in v:
o[vv].append(k)
print(dict(o))
{1: ['a', 'b', 'c'],
2: ['a', 'b'],
3: ['a'],
5: ['a'],
6: ['a'],
4: ['b', 'c']}
答案 1 :(得分:0)
词典方法可能最快。我将展示我的工作以及为什么我认为它最快。
// store old data
dOld = {}
dOld['a'] = [1,2,3,5,6]
dOld['b'] = [4,1,2]
dOld['c'] = [1,4]
// create dictionary for new data
dNew = {}
// go through letters
for key in dOld:
// go through numbers
for listItem in dOld[key]:
// put each letter in the list of letters
// for the current number
if listItem in dNew:
dNew[listItem].append(key)
else:
dNew[listItem] = [key]
// check work by printings things out
for i in dNew:
print(i, end="")
print(dNew[i])
我们必须为每个具有至少一个字母的字母循环遍历每个数字,以将其从旧字典中删除,然后将其放入新字典中。有了这段代码,我们就可以做到这一点-我们所看到的数据不会比我们需要的更多。不过我有点困惑-您用字典来格式化您的答案,所以我认为输入和输出必须采用字典形式。
您能否详细说明所需的格式?另外,由于事情花费了很长时间,因此文件I / O可能花费了很长时间。那就是我曾经发生的事情-除非您切换语言,否则这是不可避免的。
答案 2 :(得分:0)
我将采用以下更简单的方法:
In [2]: d
Out[2]: {'a': [1, 2, 3, 5, 6], 'b': [4, 1, 2], 'c': [1, 4]}
In [3]: dd = {}
In [4]: for k,v in d.items():
...: for e in v:
...: val = dd.get(str(e), [])
...: dd[str(e)] = val + [k]
...:
In [5]: dd
Out[5]:
{'1': ['a', 'b', 'c'],
'2': ['a', 'b'],
'3': ['a'],
'5': ['a'],
'6': ['a'],
'4': ['b', 'c']}
此链接可能有助于理解为什么将键变成strings
:
why-must-dictionary-keys-be-immutable