работа с комбинациями объектов в питоне - PullRequest
4 голосов
/ 17 октября 2011
>>> import itertools
>>> n = [1,2,3,4]
>>> combObj = itertools.combinations(n,3)
>>>
>>> combObj
<itertools.combinations object at 0x00000000028C91D8>
>>>
>>> list(combObj)
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
>>>
>>> for i in list(combObj): #This prints nothing
...     print(i)
...
  1. Как я могу пройти через combObj?

  2. Как я могу конвертировать
    [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
    до
    [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]

Ответы [ 3 ]

7 голосов
/ 17 октября 2011

После того, как вы итерируете объект itertools.combinations один раз, он израсходован, и вы не можете повторить его во второй раз.

Если вам нужно повторно использовать его, правильный способ - сделать его list или tuple, как вы это сделали. Все, что вам нужно сделать, это дать ему имя (назначить его переменной), чтобы оно оставалось без изменений.

combList = list(combObject) # Don't iterate over it before you do this!

Если вы хотите повторить его всего один раз, вы просто не вызываете list для него вообще:

for i in combObj: # Don't call `list` on it before you do this!
    print(i)

Примечание: стандартный способ именования экземпляров / нормальных переменных объекта будет comb_obj, а не combObj. См. PEP-8 для получения дополнительной информации.

Чтобы преобразовать внутренние tuple с в list с, используйте понимание списка и встроенное list():

comb_list = [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
comb_list = [list(item) for item in comb_list]
0 голосов
/ 17 октября 2011
Генераторы

хороши тем, что они не используют много памяти. Если вы часто его используете и имеете память, сохраните ее как кортеж вместо генератора.

В противном случае я часто создаю функцию, которая возвращает генератор каждый раз, когда я хочу его использовать:

>>> def get_combObj():
...     return itertools.combinations(n,3)
...
>>> for i in get_combObj():
...     print list(i)
...
[1, 2, 3]
[1, 2, 4]
[1, 3, 4]
[2, 3, 4]

(вы можете вызывать get_combObj () сколько хотите)

0 голосов
/ 17 октября 2011

Чтобы преобразовать в список списков, вы можете сделать:

[list(item) for item in combObj]
...