Вложенный список из списка, используя понимание списка? - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть следующее list, которое называется flat:

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

Я разделил его на list из tuples, используя функцию zip как

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

со следующим выводом:

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

Теперь, как преобразовать список flat в следующий результат, используя понимание списка?

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

Ответы [ 4 ]

0 голосов
/ 06 сентября 2018

Попробуйте использовать 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)]

Здесь у вас есть живой пример

Тесты с 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 // itert + время понимания

0 голосов
/ 06 сентября 2018

Чистый подход к пониманию списка:

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

Здесь range(0, len(flat)-2, 2) позволяет выполнять итерацию по индексам плоского массива с шагом в два, а [flat[a], flat[a+1]] получает пару элементов в виде списка. Этот подход потерпит неудачу, если длина оригинального списка не кратна 2.

0 голосов
/ 06 сентября 2018

Используя понимание списка, вы можете использовать:

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

, что дает

[['11', '13'], ['17', '19'], ['13', '17'], ['19', '22'], ['35', '14']]
0 голосов
/ 06 сентября 2018

Метод 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']]
...