【问题标题】:1:n values in dictionary python字典python中的1:n值
【发布时间】:2018-01-23 03:27:48
【问题描述】:

我在完成一个简单的任务时遇到了一些麻烦。

我有 2 个这样的列表(长度相同):

f1 = ['Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Deep', 'Deep', 'Deep', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Deep', 'Deep']
f2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

我想要构建的是一个字典,其中的键取自f1,值应该是对应键的数字列表(f2 包含一些唯一的 id)。

类似:

d = {}
d['Shallow'] = [0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14]
d['Deep'] = [5, 6, 7, 15, 16]

我尝试使用 zip 循环,但我肯定错过了一些东西,并且只附加了最后一项:

d = {}

for i, j in zip(f1, f2):
    d[i] = []
    d[i].append(j)

感谢您的建议

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    问题是d[i] = [] 总是会用一个新的空列表覆盖'Shallow''Deep' 的条目。你想要的只是在它不存在的情况下才这样做:

    d = {}
    
    for i, j in zip(f1, f2):
        if i not in d:
            d[i] = []
        d[i].append(j)
    

    或者,使用defaultdict 自动处理此问题:

    from collections import defaultdict
    
    d = defaultdict(list)
    
    for i, j in zip(f1, f2):
        d[i].append(j)
    

    【讨论】:

    • 或...d.setdefault(i, []).append(j)...(或使用defaultdict
    • 完美。正是我想要的!
    【解决方案2】:

    实际上有几种简单的方法可以在列表中查找内容。 StackOverflow 上已经有多种解决方案:

    Example 1

    Example 2

    一种简单的方法是 python 生成索引列表:

    matches = [index for index, value in enumerate(SomeList) if value == 'SomeValue']
    

    因此,您的案例的代码是:

    f1 = ['Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Deep', 'Deep', 'Deep', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Deep', 'Deep']
    
    d = {}
    d['Shallow'] = [index for index, value in enumerate(f1) if value == 'Shallow']
    d['Deep']    = [index for index, value in enumerate(f1) if value == 'Deep'   ]
    
    print(d)
    

    这将产生下一个结果:

    {'Shallow': [0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14], 'Deep': [5, 6, 7, 15, 16]}
    

    此代码未优化,它会“重复”自身。也不使用“f2”列表(您可以根据“f1”的索引从“f2”获取值)。但是对于理解一般概念来说已经足够了。

    【讨论】:

    • 感谢您的链接和解释,我会深入研究一下
    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多