4

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

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

结果列表r的长度正好是 11。对于 中的每个索引jr如果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

4 回答 4

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]
于 2013-09-06T14:03:14.790 回答
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]
于 2013-09-06T13:53:27.960 回答
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 ]
于 2013-09-06T13:55:07.980 回答
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]
于 2013-09-06T13:58:36.273 回答