从单词中获取字符串列表

Get a string list from a word

我正在尝试反转包含字符串作为键和字符串列表作为值的字典的项目:

dico = {'key1': [],
        'key2': [],
        'key3': ['value1', 'value1'],
        'key4': ['value2', 'value2'],
        'key5': ['value3'],
        'key6': ['value1', 'value2', 'value3']}

new_dict = {}

for key, values in dico.items():
    if values:
        for value in values:
            try:
                if key not in new_dict[value]:
                    new_dict[value].append(key)
            except KeyError:
                new_dict[values[0]] = list(key)
            else:
                print('ERROR')

这是预期的结果:

#Expected
new_dict = {'value1': ['key3', 'key6'],
            'value2': ['key4', 'key6'],
            'value3': ['key5', 'key6']}
#Reality
new_dict = {'value1': ["k", "e", "y", "3", "k", "e", "y", "6"],
            'value2': ["k", "e", "y", "4", "k", "e", "y", "6"],
            'value3': ["k", "e", "y", "5", "k", "e", "y", "6"]}

我注意到如果我改变它:

new_dict[values[0]] = list(key)

据此:

new_dict[values[0]] = []
new_dict[values[0]].append(key)

它确实有效,但还有另一种方法可以在一行中完成吗?

您正在将钥匙转到列表:

new_dict[values[0]] = list(key)

这将生成一个包含单个字符的列表。改用列表文字:

new_dict[values[0]] = [key]

您可以使用 dict.setdefault() method 来处理 new_dict 中丢失的键以简化您的代码。看起来您想改为生成 sets;设置跟踪 unique 值并避免您必须对重复项进行显式测试。

for key, values in dico.items():
    for value in values:
        new_dict.setdefault(value, set()).add(key)

之后您可以随时将这些集合转回列表:

new_dict = {key: list(values) for key, values in new_dict.items()}

演示:

>>> dico = {'key1': [],
...         'key2': [],
...         'key3': ['value1', 'value1'],
...         'key4': ['value2', 'value2'],
...         'key5': ['value3'],
...         'key6': ['value1', 'value2', 'value3']}
>>> new_dict = {}
>>> for key, values in dico.items():
...     for value in values:
...         new_dict.setdefault(value, set()).add(key)
... 
>>> new_dict
{'value3': set(['key6', 'key5']), 'value2': set(['key6', 'key4']), 'value1': set(['key3', 'key6'])}
>>> {key: list(values) for key, values in new_dict.items()}
{'value3': ['key6', 'key5'], 'value2': ['key6', 'key4'], 'value1': ['key3', 'key6']}
  1. 迭代主 dico 字典中的每个项目。
  2. 检查值是否存在。
  3. 从值迭代每个项目。
  4. 使用 set 方法删除重复值。
  5. 添加到 new_dict 字典,其中值是键,键是列表值。

代码:

dico = {'key1': [],
        'key2': [],
        'key3': ['value1', 'value1'],
        'key4': ['value2', 'value2'],
        'key5': ['value3'],
        'key6': ['value1', 'value2', 'value3']}

new_dict = {}

for key, values in dico.items():
    if values:
        for value in set(values):
            try:
                new_dict[value].append(key)
            except:
                new_dict[value] = [key]

import pprint
pprint.pprint(new_dict)

输出:

$ python test.py 
{'value1': ['key3', 'key6'],
 'value2': ['key6', 'key4'],
 'value3': ['key6', 'key5']}