我有几个列表,其标题如下: 我创建这种列表的方式是使用字典:
myOwnList = {'A' : [1,2,3,4],
'B' : [1,2,4],
'C' : [1,2,3],
'D' : [1,2,3,4]
}
Visually, this is it should look like:
A B C D
1 1 1 1
2 2 2 2
3 3 3
4 4 4
我想要做的是重新排列上面的列表:
myOwnListNew = {1 : ['A', 'B', 'C', 'D'],
2 : ['A', 'B', 'C', 'D'],
3 : ['A', 'C', 'D'],
4 : ['A', 'B', 'D'],
}
visually:
1 A B C D
2 A B C D
3 A C D
4 A B D
我不确定这种类型的重新安排是什么,它看起来不像转置。
我应该如何在python中实现这个,我应该使用简单列表还是字典?感谢
答案 0 :(得分:3)
直接翻译对我来说是最简单的。它的复杂程度低于Ffisegydd的答案:
lists = {
'A': [1, 2, 3, 4],
'B': [1, 2, 4],
'C': [1, 2, 3 ],
'D': [1, 2, 3, 4]
}
from collections import defaultdict
out = defaultdict(list)
for letter, items in lists.items():
for item in items:
out[item].append(letter)
dict(out)
#>>> {1: ['A', 'C', 'D', 'B'], 2: ['A', 'C', 'D', 'B'], 3: ['A', 'C', 'D'], 4: ['A', 'D', 'B']}
FWIW,这个是一个转置,但是是一个蒙面数组:
df
#>>> A B C D
#>>> 0 True True True True
#>>> 1 True True True True
#>>> 2 True False True True
#>>> 3 True True False True
df.T
#>>> 0 1 2 3
#>>> A True True True True
#>>> B True True False True
#>>> C True True True False
#>>> D True True True True
答案 1 :(得分:1)
假设你有一个字典,A,B,C,D是键,而数字在列表中,那么下面的代码会将你的字典转换成一个“倒置”的新字典。
d = dict(A=[1,2,3,4], B=[1,2,4], C=[1,2,3], D=[1,2,3,4])
# Create a set of all possible values.
values = set(value for x in d.values() for value in x)
new_d = {key:[k for k, v in d.items() if key in v] for key in values}
print(new_d)
# {1: ['C', 'B', 'D', 'A'], 2: ['C', 'B', 'D', 'A'], 3: ['C', 'D', 'A'], 4: ['B', 'D', 'A']}
因为您正在使用字典和集合,所以字母的顺序可能不是您所期望的。你可以随时根据需要自己对这些进行排序,或者在列表理解中添加sorted()
函数,这样就可以了
new_d = {key:sorted([k for k, v in d.items() if key in v]) for key in values}
print(new_d)
# {1: ['A', 'B', 'C', 'D'], 2: ['A', 'B', 'C', 'D'], 3: ['A', 'C', 'D'], 4: ['A', 'B', 'D']}