【问题标题】:Get a string list from a word从单词中获取字符串列表
【发布时间】:2015-01-27 14:44:37
【问题描述】:

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

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]] = [key] 怎么样?
  • 这里的pretty_dict 是什么?
  • 请注意,list('key1') 的计算结果为 ['k', 'e', 'y', '1'],第二个实际计算结果为 ['key1']
  • 与问题无关,但除非此处省略更多代码,否则您不需要if values: 检查。如果没有值,for 循环将不会运行。
  • 感谢你们回复得如此迅速和准确。它帮助了我! :)

标签: python string list dictionary word


【解决方案1】:

您正在将钥匙转到列表:

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

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

new_dict[values[0]] = [key]

您可以使用dict.setdefault() method 处理new_dict 中缺少的键,以简化您的代码。看起来您想生成 sets ;设置跟踪 唯一 值,让您不必对重复项进行显式测试。

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']}

【讨论】:

    【解决方案2】:
    1. 迭代主 dico 字典中的每个项目。
    2. 检查值是否存在。
    3. 从值迭代每个项目。
    4. 使用set 方法删除重复值。
    5. 添加到 new_dict 字典,其中 value 是 key,key 是 list value。

    代码:

    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']}
    

    【讨论】:

    • 这会生成一个包含重复键的列表。 OP 似乎热衷于为每个值生成唯一键序列。 key3 在您的输出中针对value1 出现两次
    • 是的,已更新,现在使用 set 从列表中删除重复值。
    • 不错,确实是 per key 的值必须是唯一的。
    • @MartijnPieters:是的,谢谢。 :) 你对每个答案都太快太准确了。我怎么能联系到你?我想学更多的python
    • 我的个人资料中包含有关如何联系我以获得专家支持的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    相关资源
    最近更新 更多