【问题标题】:how to make a single list out of this lists of lists , using list comprehension?如何使用列表理解从这个列表列表中创建一个列表?
【发布时间】:2012-05-04 10:25:05
【问题描述】:

如何在一行中做到这一点。

   b=[['1','2','3','4','5'],['11','12','13','14','15'],['6','7','8','9','10']]
   c=[]
   for x in b:
        for y in x:
            c.append(int(y))
   c.sort()
   print(c)

预期输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

【问题讨论】:

    标签: python list python-3.x


    【解决方案1】:
    >>> b=[['1','2','3','4','5'],['11','12','13','14','15'],['6','7','8','9','10']]
    >>> sorted(int(j) for i in b for j in i)
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
    

    【讨论】:

    • 1UP:简洁的解决方案,无需导入。
    • 我的 +1。我唯一不喜欢的是使用l 标识符;)
    • @pepr 我将其更改为使用常规的ij 现在进行迭代。
    【解决方案2】:
    import itertools
    c = sorted(int(a) for a in itertools.chain(*b))
    

    或者,正如@jamylak 正确指出的那样:

    import itertools
    c = sorted(int(a) for a in itertools.chain.from_iterable(b))
    

    使用map 会快一点(而且比@jamylak 的答案中的双重列表理解要快):

    import itertools
    c = sorted(map(int, itertools.chain.from_iterable(b)))
    

    【讨论】:

    • 哦,见鬼。我忘了itertools。 ;)
    • 为什么没有人喜欢chain.from_iterable
    • @eumiro 这比 jamylak 的回答快吗?
    • @user1374499 - 不是真的。在这种情况下,它慢了 6%。
    • @user1374499 - 使用map(int… 比他的回答更快。
    【解决方案3】:

    另一种变化

    >>> from itertools import chain
    >>> b=[['1','2','3','4','5'],['11','12','13','14','15'],['6','7','8','9','10']]
    >>> sorted(chain(*b),key=int)
    ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15']
    

    如果你想要一个整数列表,那么

    >>> sorted(map(int,chain(*b)))
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
    

    速度对比

    >>> t1=Timer(stmt='sorted(map(int,chain(*b)))',setup='from __main__ import b;from itertools import chain')
    >>> t2=Timer(stmt='sorted(int(i) for l in b for i in l)',setup='from __main__ import b')
    >>> t3=Timer(stmt='sorted(int(a) for a in chain(*b))',setup='from __main__ import b;from itertools import chain')
    >>> print "%.2f usec/pass" % (1000000 * t1.timeit(number=100000)/100000)
    33.23 usec/pass
    >>> print "%.2f usec/pass" % (1000000 * t2.timeit(number=100000)/100000)
    35.60 usec/pass
    >>> print "%.2f usec/pass" % (1000000 * t3.timeit(number=100000)/100000)
    36.19 usec/pass
    

    【讨论】:

    • OP 想要一个int 对象的列表。
    • @MattH:对不起,我错过了那部分。
    • 但您也在为 t1&t3 导入 itertools。
    • @AshwiniChaudhary:我没有得到你的关注。导入 itertools 会不会有任何伤害?如果您看到使用map,即使导入开销也会更快。
    • 现在不用担心,实际上from itertools import chain 在我滚动之前在Timer 中是不可见的。
    猜你喜欢
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多