假设你有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。
答案 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')]