как я могу изменить [('a', 1), ('c', 3), ('b', 2)]
на ['a',1,'c',3,'b',2]
и наоборот? Thanksпереход от кортежа к списку и наоборот
ответ
Переход в первом направлении от [('a', 1), ('c', 3), ('b', 2)]
до ['a',1,'c',3,'b',2]
is flattening a list. Принимая принятый ответ от туда и модификация для этого примера:
>>> L = [('a', 1), ('c', 3), ('b', 2)]
>>> list(itertools.chain(*L))
['a', 1, 'c', 3, 'b', 2]
Это использует itertools.chain
, который является хорошим средством от itertools
, понижающих последовательностей довольно красиво.
Переход в обратном направлении будет проноситься:
>>> L = ['a', 1, 'c', 3, 'b', 2]
>>> zip(L[0::2], L[1::2])
[('a', 1), ('c', 3), ('b', 2)]
zip
принимает два списка и сочетает в себе список 1 в первый элемент с списка 2 в первый элемент кортежа, и так далее вниз по длине списка. Так что в этом, мы в основном принимаем даже индексированные элементы, как наш первый список (L[0::2]
), а затем нечетные индексированные элементы, как наш второго (L[1::2]
)
Вот это мой взгляд на него (при условии, содержит первый список и б второй):
b = []
for i in a:
b.extend(i)
и обратное:
c = []
for i in range(0, len(b) - 1, 2):
c.append((b[i], b[i+1]))
+1, FWIW, ваша версия первой имеет тенденцию быть быстрее, чем моя в моих тестах и моя быстрее, чем ваша на втором - http://pastebin.com/SNrsqDmB –
@ Даниэль: Будьте осторожны с преждевременной оптимизацией. –
@Fred остерегайтесь куртизации груза. Выяснение того, какой путь быстрее, помогает изучать язык, поэтому вы можете записать его быстрым способом в первый раз. – aaronasterling
L = [('a', 1), ('c', 3), ('b', 2)]
flat = [x for p in L for x in p]
assert flat == ['a', 1, 'c', 3, 'b', 2]
it = iter(flat)
L2 = zip(it, it)
assert L2 == L
print "Success"
+1 для 'iter (flat)'. Это самый элегантный способ сделать это. – aaronasterling
есть уже много правильных ответов здесь, так что это просто напоминание не использовать сумму() для выравнивания списков, хотя это выглядит как аккуратное решение , к сожалению, производительность является квадратичной
In [1]: L=[('a',x) for x in range(10)]
In [2]: timeit sum(L,())
100000 loops, best of 3: 2.78 us per loop
In [3]: L=[('a',x) for x in range(100)]
In [4]: timeit sum(L,())
10000 loops, best of 3: 108 us per loop
In [5]: L=[('a',x) for x in range(1000)]
In [6]: timeit sum(L,())
100 loops, best of 3: 8.02 ms per loop
- 1. Looping array - Переход от последнего к первому и наоборот?
- 2. Наследование таблицы Postgres: переход от родительского к дочернему и наоборот
- 3. Переход от «При использовании приложения» к «Всегда» и наоборот от кода
- 4. Invert скобка от {к}, и наоборот
- 5. Изменение поведения UIBarButtonItem и переход от действия к segue и наоборот
- 6. Кортежа к списку - Python/обратный PostgreSQL типа SETOF записи
- 7. От матрицы к списку слов
- 8. Excel - от матрицы к списку
- 9. Python от генератора к списку
- 10. Переход от раскадровки к нибу и обратно
- 11. Присвоение матричного элемента по списку ключей кортежа
- 12. Переход от Ning к Wordpress
- 13. Переход от MySQL к MySQLi
- 14. Переход от Rhino3D к браузеру
- 15. Переход от UIViewController к SKcene
- 16. Переход от WINARM к Yagarto
- 17. переход от html4 к html5
- 18. Переход от COM к DCOM
- 19. переход от MSSQL к SQLSRV
- 20. Переход от mongodb к postgresql
- 21. Переход от WebForms к WinForms
- 22. Переход от java к HTML
- 23. Переход от lighttpd к nginx
- 24. переход от Openldap к Samba4
- 25. Переход от java к C++
- 26. Переход от Castor к JPA
- 27. Переход от MATLAB к Python
- 28. Переход от Drupal к Yii
- 29. Переход от AIR к javascript
- 30. Переход от SQLalchemy к psycopg2
Не забудьте 'itertools.izip_longest (* [ИТЭР (L)] * 2) '. ;-) – Apalala
Кроме того, поскольку у вас уже есть 'itertools', вы можете либо' izip', либо 'zip' над' islice', чтобы не копировать список. – aaronasterling