3

我有一个看起来像这样的列表:

[['Tom', 'Dick'], ['Harry', 'John', 'Mike'], ['Bob']]

我想把它变成一个字典,其中每个键是一个名称,每个值是一个与其子列表在列表中的位置相对应的数字:

{'Tom': 0, 'Dick': 0, 'Harry': 1, 'John': 1, 'Mike': 1, 'Bob': 2}

我尝试了各种列表推导,但我无法让它与嵌套列表一起正常工作。我可以使用嵌套循环,如下所示:

names = [['Tom', 'Dick'], ['Harry', 'John', 'Mike'], ['Bob']]
names_dict = {}
for i, name_sublist in enumerate(names):
    for name in name_sublist:
        names_dict[name] = i

但我怀疑有一种更短、更优雅的方法。

4

3 回答 3

19

与 MizardX 相同的想法,但在 Python 3.0 中使用dict 推导更小更漂亮:

>>> names = [['Tom', 'Dick'], ['Harry', 'John', 'Mike'], ['Bob']]
>>> names_dict = {name:index for index, lst in enumerate(names) for name in lst}
>>> names_dict
{'Tom': 0, 'Mike': 1, 'Dick': 0, 'Harry': 1, 'Bob': 2, 'John': 1}
于 2009-02-10T23:09:25.147 回答
14
names_dict = dict((name,index)
                  for index,lst in enumerate(names)
                  for name in lst)

例子:

>>> names = [['Tom', 'Dick'], ['Harry', 'John', 'Mike'], ['Bob']]
>>> names_dict = dict((name,index)
...                   for index,lst in enumerate(names)
...                   for name in lst)
>>> names_dict
{'Tom': 0, 'Mike': 1, 'Dick': 0, 'Harry': 1, 'Bob': 2, 'John': 1}
于 2009-02-10T22:51:09.933 回答
1

蟒蛇2.6

dict([(t,l.index(x)) for x in l for t in x])

python3.0

{t:l.index(x) for x in l for t in x}

如果 l 是名称列表

于 2011-01-12T20:39:19.320 回答