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