2016-04-10 120 views
0
a = [(1, "X"), (2, 'Y')] 
b = [(1, 'Z'), (2, 'K')] 
c = [t[1] for t in b] 

d = [] 
i=0 
for element in a: 
    d.append(element + (c[i],)) 
    i += 1 

print d 

的列表给出了我期望的输出 [(1, 'X', 'Z'),(2, 'Y', 'K')]追加列表元素的元组

然而这似乎是一个不必要的长途跋涉。是否有更有效的方法(以代码的形式)实现相同的结果?

+0

答案一定程度上取决于'了'和'B'的结构。元组是否总是排序并始终从1开始索引?如果是这样,为什么?在这种情况下,你可以使用简单列表和'zip()'。 – hop

回答

3

使用zip

d = [x + y[1:] for x, y in zip(a, b)] 

或者map

d = map(lambda x, y: x + y[1:], a, b) 

zip创建tuplelist A S并行iterables记者要素:

a = [1, 2, 3] 
b = ['a', 'b', 'c'] 
c = [4, 5, 6] 
# zip(a, b, c): [(1, 'a', 4), (2, 'b', 5), (3, 'c', 6)] 
+0

太棒了!但是我很难理解它是如何工作的。 –

+0

@Sášsöfföföӽ添加了一些插图。实际的例子有点复杂,因为'a'和'b'的元素本身就是'元组'。 – schwobaseggl

+0

如果列表的长度不均匀,这样会工作吗?例如,如果我想创建一个基于最长列表长度的元组结构? (我指的是你在与我的问题相关的答案下给出的例子。) – MarcelKlockman

0

的数据结构体s埃姆有点不寻常,但这是获得结果的一种方式。

a = [(1, "X"), (2, 'Y')] 
b = [(1, 'Z'), (2, 'K')] 

a1, a2 = zip(*a) # -> a1 = (1, 2); a2 = ('X', 'Y') 
_, b2 = zip(*b) # -> b2 = ('Z', 'K') 

d = zip(a1, a2, b2) 

a1a2b2只是必要的,因为ab本身是相当麻烦的。

如果ab中的元组总是始终从1开始顺序编号,为什么要索引呢?

a = ('X', 'Y') 
b = ('Z', 'K') 

d = zip(a, b) # -> [('X', 'Z'), ('Y', 'K')] 

,如果你需要的指数,可以随时enumerate()

for i, e in enumerate(d, 1): 
    print i, e