python,重新排列列表以显示列表中包含的项目
python, rearrange the list to show the item which contains in most list
我有几个列表,它们的标题如下:
我创建这种列表的方式是使用字典:
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 中实现这个的任何建议,我应该使用简单列表还是字典?谢谢
假设您构建了一个字典,其中 A、B、C、D 是键并且数字在列表中,那么下面的代码会将您的字典转换为新字典,即 "inverted"。
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']}
直接翻译对我来说是最简单的。它的复杂性也低于 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
我有几个列表,它们的标题如下: 我创建这种列表的方式是使用字典:
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 中实现这个的任何建议,我应该使用简单列表还是字典?谢谢
假设您构建了一个字典,其中 A、B、C、D 是键并且数字在列表中,那么下面的代码会将您的字典转换为新字典,即 "inverted"。
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']}
直接翻译对我来说是最简单的。它的复杂性也低于 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