使用列表理解从列表中嵌套列表?

时间:2018-09-06 12:37:30

标签: python list list-comprehension

我有以下名为list的{​​{1}}:

flat

我使用flat= ['11','13', '17', '19', '13', '17', '19','22','35','14','15'] 函数将其拆分为list的{​​{1}},

tuples

具有以下输出:

zip

现在,如何使用列表理解将列表list(zip(flat[0::2], flat[1::2])) 转换为以下结果?

[('11', '13'), ('17', '19'), ('13', '17'), ('19', '22'), ('35', '14')]

4 个答案:

答案 0 :(得分:2)

方法1:,无需列表理解

您需要map zip反对list

list(map(list,zip(flat[0::2], flat[1::2])))

[['11', '13'], ['17', '19'], ['13', '17'], ['19', '22'], ['35', '14']]

方法2 :使用列表理解:

[list(l) for l in zip(flat[0::2], flat[1::2])]

[['11', '13'], ['17', '19'], ['13', '17'], ['19', '22'], ['35', '14']]

或者:

[[l1,l2] for l1,l2 in zip(flat[0::2], flat[1::2])]

[['11', '13'], ['17', '19'], ['13', '17'], ['19', '22'], ['35', '14']]

答案 1 :(得分:2)

纯列表理解方法:

[[flat[a], flat[a+1]] for a in range(0, len(flat)-2, 2)]

此处range(0, len(flat)-2, 2)允许以2为步长遍历平面数组的索引,而[flat[a], flat[a+1]]获得一对元素作为列表。如果原始列表的长度不是2的倍数,则此方法将失败。

答案 2 :(得分:1)

使用列表理解,您可以使用:

[[flat[i], flat[i+1]] for i in range(0, len(flat)-1, 2)]

产生

[['11', '13'], ['17', '19'], ['13', '17'], ['19', '22'], ['35', '14']]

答案 3 :(得分:1)

考虑使用itertools避免重复两次复制列表:

import itertools

flat= ['11','13', '17', '19', '13', '17', '19','22','35','14','15']

result = list(
  map(list,
      zip(
        itertools.islice(flat, 0, len(flat), 2),
        itertools.islice(flat, 1, len(flat), 2)
      )
  )
)
print(result)

或使用iter

it = iter(flat)
[[x, y] for x, y in zip(it, it)]

这里有live example

使用timeit进行的测试报告,具有列表理解能力的iter解决方案是更好的方法:

import itertools

flat= ['11','13', '17', '19', '13', '17', '19','22','35','14','15']

def lcomprehension_aproach(flat):
  return [[flat[a], flat[a+1]] for a in range(0, len(flat)-2, 2)]

def itertools_aproach(flat):
  result = list(
    map(list,
        zip(
          itertools.islice(flat, 0, len(flat), 2),
          itertools.islice(flat, 1, len(flat), 2)
        )
    )
  )
  return result

def iter_aproach(flat):
  it = iter(flat)
  return [[x, y] for x, y in zip(it, it)]

print(lcomprehension_aproach(flat))
print(itertools_aproach(flat))  
print(iter_aproach(flat))

from timeit import timeit

print(timeit("lcomprehension_aproach(flat)", globals=globals()))
print(timeit("itertools_aproach(flat)",      globals=globals()))
print(timeit("iter_aproach(flat)",           globals=globals()))
  

5.122298364993185 //列表理解时间(杰克·艾德利解决方案)

     

8.221981940994738 // itertools时间

     

3.757848952009226 //迭代+理解时间