列表中的切片元组(python)

时间:2018-06-12 11:56:26

标签: python indexing tuples list-comprehension slice

假设你有list of tuples这样:

list_of_tuples = 
    [('11','12','13'),('21','22','23'),('31','32','33'),('41','42','43')]

现在我想切片这个列表或元组,以便我有(一个新的)列表,只有每个元组的前两个条目。所以,我想得到这个:

new_list = [('11','12'),('21','22'),('31','32'),('41','42')]

我的第一次尝试是new_list = list_of_tuples[:][0:2]之类的语法。第一个括号[:]索引整个列表,[:2]取每个元组的元素0和1。但是,这总是返回前两个元组,包含所有三个原始条目。 (所以,我得到[('11','12','13'),('21','22','23')])。

为什么它不能像这样工作,这里的基本pythonic行为是什么?我还注意到,我写[:][:][:]的方式并不重要。

获得我想要的结果的一种方法是编写像new_list = [(t[0], t[1]) for t in list_of_tuples]这样的列表理解,但这需要更多的代码,我也认为我的原始方法也是pythonic。

6 个答案:

答案 0 :(得分:2)

第一次尝试是这样做的:

new_list = list_of_tuples[:] # Copy of the list
list_of_tuples[:][0:2] # element 0 to 2 of the copy.

因此,您获得了list_of_tuples的第一个元素:

[('11','12','13'),('21','22','23')]

这就是python的工作方式^^'

编辑:如果你放了几个[:]你只是"复制"几次原始列表,这就是为什么它与你放置多少这一点并不重要......

答案 1 :(得分:2)

您的逻辑无效,因为切片不会对列表中的每个子列表进行操作。它只会在外部列表上运行。

您可以使用列表理解:

new_list = [i[:2] for i in list_of_tuples]

或者,对于功能性解决方案,您可以使用operator.itemgetter

from operator import itemgetter

new_list = list(map(itemgetter(0, 1), list_of_tuples))

print(new_list)

[('11', '12'), ('21', '22'), ('31', '32'), ('41', '42')]

您正在寻找的语法类似于NumPy数组索引。 NumPy是第三方库,允许同时按多个维度进行索引:

import numpy as  np

arr = np.array(list_of_tuples).astype(int)
res = arr[:, :2]

print(res)

[[11 12]
 [21 22]
 [31 32]
 [41 42]]

答案 2 :(得分:2)

您可以在第一个列表中简单地对元组进行切片。类似于:

>>> list_of_tuples = [('11','12','13'),('21','22','23'),('31','32','33'),('41','42','43')]
>>> new_list = [item[:2] for item in list_of_tuples]
>>> new_list
[('11', '12'), ('21', '22'), ('31', '32'), ('41', '42')]

答案 3 :(得分:1)

您可以使用:

[(x, y) for x, y, _ in list_of_tuples]

或使用列表理解进行切片:

[x[:2] for x in list_of_tuples]

<强>输出

[('11', '12'), ('21', '22'), ('31', '32'), ('41', '42')]

答案 4 :(得分:0)

你也可以使用lambda和map函数

if(request.getAttribute("firstForm")!=null && request.getAttribute("firstForm").equals("yes"){
{
      // redirect to jsp having second form
}
else{
      // get back to jsp having first form
}

答案 5 :(得分:-1)

  

list = [('11','12','13'),('21','22','23'),('31','32','33'),(' 41' , '42', '43')]

     

打印[([0],[1])列表中的内容]

你将获得o / p

  

[('11','12'),('21','22'),('31','32'),('41','42')]