操作列表中对象的特定部分的有效方法

时间:2017-04-06 20:38:11

标签: python list python-3.x

我正在寻找一种有效的方法来获取列表中某个对象的特定部分,以便对其进行操作。

例如,如果我有

l = (('a', 1, 2, 3), ('b', 4, 5, 6), ('c', 7, 8, 9))

打印索引将导致

>>>print(l)
(('a', 1, 2, 3), ...)

我想知道是否有一种方法可以从列表中的每个对象中仅抓取前两个内容(例如' a'' 1')获得

>>>print(l)
(('a', 1), ('b', 4), ('c', 7))

并返回/操纵它们?我意识到我可以将索引复制到另一个列表中,然后打印/返回副本的前两个索引,但是当放大时这将是一个痛苦。

提前致谢

5 个答案:

答案 0 :(得分:2)

在生成器理解中使用切片非常简单,转换为tuple

l = (('a', 1, 2, 3), ('b', 4, 5, 6), ('c', 7, 8, 9))

l = tuple(z[:2] for z in l)

print(l)

结果:

(('a', 1), ('b', 4), ('c', 7))

答案 1 :(得分:2)

您可以使用生成器理解 切割嵌套元组:

>>> l = (('a', 1, 2, 3), ('b', 4, 5, 6), ('c', 7, 8, 9))

>>> tuple(i[:2] for i in l)
(('a', 1), ('b', 4), ('c', 7))

如果没有强制要求最终值为tuple,您可以简单地将列表理解写为:

>>> [i[:2] for i in l]
[('a', 1), ('b', 4), ('c', 7)]

答案 2 :(得分:1)

python中的元组是immutable。简而言之,这意味着内部元素无法替换/修改。

但是,如果您要访问前两个,则可以执行此操作:

l = (('a', 1, 2, 3), ('b', 4, 5, 6), ('c', 7, 8, 9))
x = tuple([(fst, snd) for (fst, snd, thrd, frth) in l])

有时您会发现_表示未使用(但仍未解包)的值:

l = (('a', 1, 2, 3), ('b', 4, 5, 6), ('c', 7, 8, 9))
x = tuple([(fst, snd) for (fst, snd, _, _) in l])

答案 3 :(得分:1)

这只是您可以使用可迭代解包和print使用少量关键字参数的示例。请不要选择这个答案。

l = (('a', 1, 2, 3), ('b', 4, 5, 6), ('c', 7, 8, 9))
print(*(x[:2] for x in l), sep=', ')

这不会打印外括号或允许您直接操作结果,但您始终可以将生成器的内容存储到列表中。

这是另一个回答忽略的事情。生成器理解(x[:2] for x in l)只能迭代一次,但列表推导[x[:2] for x in l]只是一个列表,可以根据需要多次操作。

如果要在打印后使用过滤后的数据,可以按如下方式重写上面的示例:

l = (('a', 1, 2, 3), ('b', 4, 5, 6), ('c', 7, 8, 9))
g = [x[:2] for x in l]
print(*g, sep=', ')

答案 4 :(得分:0)

另一个:

print([i[:2] for i in l])