python - 带有嵌套列表的字典理解,防止覆盖

标签 python list dictionary

我正在尝试使用嵌套列表来使用字典理解。只要 key 是唯一的,一切就可以正常工作。但是,如果存在多个键,我想将值附加到该键而不是覆盖该值。使用理解可以做到这一点吗?

seq1 = [[1, [1,2,3,4]], [2, [5,6,7]]]
seq2 = [[1, [1,2,3,4]], [1, [5,6,7]]]

print {key: [val] for key, val in seq1}  # Or dict(seq1)
>>> {1: [[1, 2, 3, 4]], 2: [[5, 6, 7]]}

print {key: [val] for key, val in seq2}
>>> {1: [[5, 6, 7]]}  # First value is overwritten

# Desired output:
def index_reads(reads):
    result = {}
    for i in reads:
        d = dict([i])
        for key, val in d.iteritems():
            if key in result:
                result[key].append(val)
            else:
                result[key] = [val]
    return result

print index_reads(seq1)
>>> {1: [[1, 2, 3, 4]], 2: [[5, 6, 7]]}

print index_reads(seq2)
>>> {1: [[1, 2, 3, 4], [5, 6, 7]]}

抱歉,我找不到此问题的重复内容。

最佳答案

您不需要列表理解。作为一种更Pythonic的方式,你可以使用 dict.setdefault()方法:

>>> d={key: [val] for key, val in seq1}
>>> for key, val in seq2:
...   d.setdefault(key,[]).append(val)
... 
>>> d
{1: [[1, 2, 3, 4], [1, 2, 3, 4], [5, 6, 7]], 2: [[5, 6, 7]]}

您还可以使用collections.defaultdict来完成此类任务。

当您在 seq2 中使用不同的键时,它也会显示出它的强大功能,例如:

>>> seq2 = [[1, [1,2,3,4]], [5, [5,6,7]]]
>>> d={key: [val] for key, val in seq1}
>>> for key, val in seq2:
...   d.setdefault(key,[]).append(val)
... 
>>> d
{1: [[1, 2, 3, 4], [1, 2, 3, 4]], 2: [[5, 6, 7]], 5: [[5, 6, 7]]}

如果您不想保留重复项,可以使用 defaultdictset 作为容器:

>>> from collections import defaultdict
>>> seq1 = [[1, [1,2,3,4]], [2, [5,6,7]]]
>>> seq2 = [[1, [1,2,3,4]], [1, [5,6,7]]]
>>> 
>>> d=defaultdict(set)
>>> for key, val in seq1+seq2:
...   d[key].add(tuple(val))
... 
>>> d
defaultdict(<type 'set'>, {1: set([(5, 6, 7), (1, 2, 3, 4)]), 2: set([(5, 6, 7)])})

关于python - 带有嵌套列表的字典理解,防止覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30778696/

相关文章:

python - 从 Pandas DataFrame 中删除列表

python - 使用字典值在两个日期之间进行 Pandas Dataframe 查询

python - python 循环中的 lambda 运算符

c++ - 我可以读取输入数据并创建通用的 C++ 数据结构吗?

python - 如何在Python中动态创建方法(名称+代码)

c++ - 如何将 C++ std::list 元素转换为 multimap 迭代器

python - Django ImageField - 仅呈现 &lt;input&gt; 元素

c - 多线程访问数据结构

c++ - 如何从命令行编译 Visual Studio 项目?

python - 使用 For 循环返回 Pandas Dataframe 中的唯一值