2015-06-11 44 views
1

我正在尝试使用使用嵌套列表的字典理解。只要钥匙是唯一的,一切正常。但是,如果存在多个密钥,我想将值附加到该密钥而不是覆盖该值。这可能使用理解吗?带有嵌套列表的字典理解,防止覆盖

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

对不起,我找不到这个问题的重复。

回答

1

你可以使用groupbyitertools

import itertools 
import operator 

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

def index_reads(seq): 
    return {k: [i[1] for i in g] for k, g in itertools.groupby(seq, operator.itemgetter(0))} 

print index_reads(seq1) 
print index_reads(seq2) 

输出

{1: [[1, 2, 3, 4]], 2: [[5, 6, 7]]} 
{1: [[1, 2, 3, 4], [5, 6, 7]]} 
2

你不需要列表理解。作为一个更Python的方式,你可以使用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)])}) 
+1

或使用'defaultdict' –

+0

@KarolyHorvath是啊,确实;) – Kasramvd

+0

谢谢,我会看看,但输出与预期略有不同。我现在将编辑,对不起。 – kezzos

0

是的,defaultdict作品也:

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={key: [val] for key, val in seq1} 
d = defaultdict(list) 
for key, val in seq2: 
    d[key].append(val) 

print d 

然后:

[(1, [[1, 2, 3, 4], [5, 6, 7]]) 

或者,如果我们删除SEQ1,

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

同样,你将拥有:

defaultdict(<type 'list'>, {1: [[1, 2, 3, 4], [5, 6, 7]]}) 
+0

如果seq1不存在,我应该怎么做.. – kezzos