从元组元组中创建一个列表

时间:2013-09-06 13:39:25

标签: python python-2.7

我有一个这样的元组元组:t = ((4, 3), (2, 9), (7, 2), ...),其中每个嵌套元组中的第一个元素(即t[i][0])的范围可以是1到11而不重复,但不一定是1之间的每个整数和11将出席。

我想基于r创建一个列表(或元组)t,方法如下:

结果列表r的长度为11。对于j中的每个索引r,如果j + 1 === t[i][0]i,则为r[j] = t[i][1],否则为r[j] = 0

首先将r初始化为[0] * 11,然后循环t以将t[i][1]分配给r[t[i][0] - 1]来完成此操作:

t = ((4, 3), (2, 9), (7, 2), (10, 1))
r = [0] * 11
for item in t:
    r[item[0] - 1] = item[1]

r = [0, 9, 0, 3, 0, 0, 2, 0, 0, 1, 0]

但是有没有更有效的方式(可能是一种功能性方式)?

4 个答案:

答案 0 :(得分:6)

怎么样:

>>> t
((4, 3), (2, 9), (7, 2), (10, 1))
>>> d = dict(t)
>>> [d.get(el, 0) for el in xrange(1, 12)]
[0, 9, 0, 3, 0, 0, 2, 0, 0, 1, 0]

答案 1 :(得分:1)

我会从t创建一个字典,并使用查找

填充r
t = ((4, 3), (2, 9), (7, 2))
d_t = dict(t)
r = [0]*11
r = [d_t[i+1] if i + 1 in d_t else r[i] for i, x in enumerate(r)]
print r
[0, 9, 0, 3, 0, 0, 2, 0, 0, 0, 0]

答案 2 :(得分:1)

只需使用映射(按字典)

d = { v[0]:v[1] for i,v in enumerate(t) }
result = [ d[j+1] if j+1 in d else 0  for j in t ]

答案 3 :(得分:1)

您可以使用dict和列表理解与条件表达式:

>>> dic = dict(t)
>>> [dic[i] if i in dic else 0 for i in range(1, 12)]
[0, 9, 0, 3, 0, 0, 2, 0, 0, 1, 0]