【问题标题】:getting only integers from a list of tuples python 3从元组python 3列表中只获取整数
【发布时间】:2016-08-01 09:16:50
【问题描述】:

我有一个这样的元组列表:

[(a,3), (b, 4), (c, 5), (d, 1), (e,2)]

我想从中提取一个这样的列表:

[3, 4, 5, 1, 2]

我该怎么做呢?我一直不知道该怎么做。

在这种情况下,可读性次于速度,因为这段代码将隐藏在一个注释相对较好的函数中。

【问题讨论】:

  • [i[-1] for i in lst]
  • 您需要加载整个列表还是也有内存限制?
  • 如果您决定使用哪个答案,请接受并投票。请勿编辑您的问题以添加此信息。
  • @LutzHorn 然后他需要支持我的评论:-)
  • @AvinashRaj 抱歉 :) 是否愿意将其添加为答案?

标签: python list tuples python-3.5


【解决方案1】:

如果目标是效率,让我们看看不同的方法:

from timeit import timeit
from operator import itemgetter

T = [('a',3), ('b', 4), ('c', 5), ('d', 1), ('e',2)] 

def one():
    [v for _, v in T]

def two():
    [v[-1] for v in T]

def three():
    list(map(itemgetter(1), T))

def four():
    list(map(lambda x:x[1], T))

def five():
    list(zip(*T))[1]

for func in (one, two, three, four, five):
    print(func.__name__ + ':', timeit(func))

结果:

one: 0.8771702060003008
two: 1.0403959849991224
three: 1.5230304799997612
four: 1.9551190909996876
five: 1.3489514130005773

所以,第一个似乎更有效。 请注意,使用 tuple 代替 list 会改变排名,但速度较慢for one and two

one: 1.620873247000418  # slower
two: 1.7368736420003188  # slower
three: 1.4523903099998279
four: 1.9480371049994574
five: 1.2643559589996585

【讨论】:

    【解决方案2】:

    获胜的发电机:

    from operator import itemgetter
    l = [(a,3), (b, 4), (c, 5), (d, 1), (e,2)]
    r = map(itemgetter(1), l)
    

    【讨论】:

      【解决方案3】:
      tuples = [(a,3), (b, 4), (c, 5), (d, 1), (e,2)]
      

      如果每次都排在第二位:

      numbers = [item[1] for item in tuples]
      

      elif 数是整数:

      numbers = [value for item in tuples for value in item if isinstance(value, int)]
      

      Elif 数字是类似于 '3' 的字符串:

      numbers = [value for item in tuples for value in item if isinstance(value, str) and value.isdigit()]
      

      【讨论】:

        【解决方案4】:

        这是使用zip 的另一种方法:

        >>> l = [('a',3), ('b', 4), ('c', 5), ('d', 1), ('e',2)]
        >>> list(zip(*l))[1]
        (3, 4, 5, 1, 2)
        

        如果你真的需要 list 而不是 tuple

        >>> list(list(zip(*l))[1])
        [3, 4, 5, 1, 2]
        

        【讨论】:

          【解决方案5】:

          你可以这样做:

          >>> map(lambda x:x[1], lst)
          [3, 4, 5, 1, 2]
          

          在 python 3 中,执行:

          >>> list(map(lambda x:x[1], lst))
          

          【讨论】:

            猜你喜欢
            • 2012-05-10
            • 1970-01-01
            • 1970-01-01
            • 2018-09-01
            • 1970-01-01
            • 2014-06-14
            • 2015-11-27
            • 2023-03-07
            • 2016-03-02
            相关资源
            最近更新 更多