【问题标题】:Slice tuples within a list (python)在列表中切片元组(python)
【发布时间】:2018-11-21 19:38:08
【问题描述】:

假设你有一个像这样的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')])。

为什么它不能像这样工作,这里的潜在 Python 行为是什么?我也注意到了,[:][:][:]我怎么写都没关系。

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

【问题讨论】:

  • lst[:] 对列表进行切片,但没有指定任何索引,实际上您只是在制作列表的副本——所以list_of_tuples[:][0:2] 类似于list_of_tuples[:2]——它应该清楚为什么 this 不能按预期工作。
  • [:] 返回整个列表,您从中切出前 2 个项目
  • print [(a[0],a[1]) for a in list] 试试这个

标签: python indexing tuples list-comprehension slice


【解决方案1】:

第一次尝试是这样做的:

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

因此,您得到 list_of_tuples 的第 2 个元素:

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

这就是python的工作原理^^'

编辑:如果你放了几个[:],你只是在“复制”原始列表的几次,这就是为什么你放多少并不重要......

【讨论】:

  • 这不是要求的,它要求每个元组只有 2 个元素应该在那里。
  • @AstikAnand 他正在寻求解释。他已经有了列表理解的解决方案。
  • 但这不是预期的。
  • @AstikAnand 是的......他在问为什么他的尝试失败了。这就是失败的解释。 (他在一篇现已删除的帖子上对此发表了评论)。
【解决方案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]]

【讨论】:

  • 这最好地回答了 OP 的问题,因为它表明这种想法并非完全错误,但它不适用于普通 Python,仅适用于 NumPy 数组。
【解决方案3】:

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

>>> 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')]

【讨论】:

    【解决方案4】:

    你可以使用:

    [(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')]
    

    【讨论】:

      【解决方案5】:

      你也可以使用 lambda 和 map 函数来使用它

      new_list  = list(map(lambda x:x[:2],your_list))
      

      【讨论】:

        【解决方案6】:

        对列表进行迭代以对特定项目进行元组切片:

        代码语法

        list =  [('11','12','13'),('21','22','23'),('31','32','33'),('41','42','43')]
        
        new_list = [(a[0],a[1]) for a in list]
        

        输出

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-31
          • 2016-02-23
          • 1970-01-01
          • 2014-02-03
          • 2018-04-05
          • 2018-08-17
          • 1970-01-01
          • 2017-01-29
          相关资源
          最近更新 更多