【问题标题】:python select specific elements from a listpython从列表中选择特定元素
【发布时间】:2010-01-25 18:21:19
【问题描述】:

是否有一种“pythonic”方式从列表中仅获取某些值,类似于此 perl 代码:

my ($one,$four,$ten) = line.split(/,/)[1,4,10]

【问题讨论】:

    标签: python list


    【解决方案1】:

    使用列表推导

    line = '0,1,2,3,4,5,6,7,8,9,10'
    lst = line.split(',')
    one, four, ten = [lst[i] for i in [1,4,10]]
    

    【讨论】:

    • 迄今为止的最佳答案
    【解决方案2】:

    我想你在找operator.itemgetter:

    import operator
    line=','.join(map(str,range(11)))
    print(line)
    # 0,1,2,3,4,5,6,7,8,9,10
    alist=line.split(',')
    print(alist)
    # ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
    one,four,ten=operator.itemgetter(1,4,10)(alist)
    print(one,four,ten)
    # ('1', '4', '10')
    

    【讨论】:

    • 并非如此。如果你拿出演示代码,它可能看起来像这样:one,four,ten=operator.itemgetter(1,4,10)(line.split(','))
    • 你是救生员,谢谢!如果 timeit 正确,这应该会将我们今天检查的 coden-p 的运行时间从 9 小时减少到几秒。
    • 如果可以通过列表理解实现,则无需使用库,请参阅@has2k1 答案。
    【解决方案3】:

    试试operator.itemgetter(python 2.4 或更新版本可用):

    返回一个可调用对象,该对象使用操作数的 ____getitem____() 方法从其操作数中获取项目。如果指定了多个项目,则返回查找值的元组。

    >>> from operator import itemgetter
    >>> line = ','.join(map(str, range(11)))
    >>> line
    '0,1,2,3,4,5,6,7,8,9,10'
    >>> a, b, c = itemgetter(1, 4, 10)(line.split(','))
    >>> a, b, c
    ('1', '4', '10')
    

    精简:

    >>> # my ($one,$four,$ten) = line.split(/,/)[1,4,10]
    >>> from operator import itemgetter
    >>> (one, four, ten) = itemgetter(1, 4, 10)(line.split(','))
    

    【讨论】:

    • 你是救生员,谢谢!如果 timeit 正确,这应该会将我们今天检查的 coden-p 的运行时间从 9 小时减少到几秒。
    【解决方案4】:
    lst = line.split(',')
    one, four, ten = lst[1], lst[4], lst[10]
    

    【讨论】:

    • 我想你误解了这个问题
    • @Idan:可能我有,我不应该得到新列表的第 2、第 5 和第 11 个元素吗?
    • @Idan K:“Pythonic”版本不需要像 Perl 版本那样是单个表达式。
    • 虽然 itemgetter 可能会在一行中满足 OP 的要求,但我在这里必须同意 Lennart 的观点,即该解决方案最易读且易于理解
    【解决方案5】:

    这个怎么样:

    index = [1, 0, 0, 1, 0]
    x = [1, 2, 3, 4, 5]
    [i for j, i in enumerate(x) if index[j] == 1]
    #[1, 4]
    

    【讨论】:

      【解决方案6】:

      是的:

      data = line.split(',')
      one, four, ten = data[1], data[4], data[10]
      

      也可以使用itemgetter,不过我更喜欢上面的代码,更清晰,清晰==好代码。

      【讨论】:

        【解决方案7】:

        或者,如果你有一个 Numpy 数组而不是一个列表,你可以这样做:

        from numpy import array
        
        # Assuming line = "0,1,2,3,4,5,6,7,8,9,10"
        line_array = array(line.split(","))
        
        one, four, ten = line_array[[1,4,10]]
        

        这里的诀窍是您可以将列表(或 Numpy 数组)作为数组索引传递。

        编辑:我最初认为它也适用于元组,但它有点复杂。我建议坚持使用列表或数组。

        【讨论】:

          【解决方案8】:

          使用熊猫:

          import pandas as pd
          line = "0,1,2,3,4,5,6,7,8,9,10"
          line_series = pd.Series(line.split(','))
          one, four, ten = line_series[[1,4,10]]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-10-14
            相关资源
            最近更新 更多