Como faço para mesclar uma matriz 2D em Python em uma corda com compreensão da lista?

StackOverflow https://stackoverflow.com/questions/103844

  •  01-07-2019
  •  | 
  •  

Pergunta

compreensão da lista para mim parece ser como o bloco opaca de granito que expressões regulares são para mim. Eu preciso ponteiros.

Say, eu tenho uma lista 2D:

li = [[0,1,2],[3,4,5],[6,7,8]]

Eu gostaria de mesclar isso também em uma lista longa

li2 = [0,1,2,3,4,5,6,7,8]

ou em uma string com separadores:

s = "0,1,2,3,4,5,6,7,8"

Realmente, eu gostaria de saber como fazer as duas coisas.

Foi útil?

Solução

Assim:

[ item for innerlist in outerlist for item in innerlist ]

Virando que diretamente em uma string com separadores:

','.join(str(item) for innerlist in outerlist for item in innerlist)

Sim, a ordem de 'para innerlist em outerlist' e 'para o item em innerlist' está correto. Mesmo que o "corpo" do circuito é no início do listcomp, a ordem de loops aninhados (e 'se' cláusulas) ainda é o mesmo que quando você iria escrever o loop out:

for innerlist in outerlist:
    for item in innerlist:
        ...

Outras dicas

Tente isso:

li=[[0,1,2],[3,4,5],[6,7,8]]
li2 = [ y for x in li for y in x]

Você pode lê-lo como este:
Dá-me a lista de todos os ys.
Os ys vêm dos xs.
Os xs vêm de li.

Para mapear isso em uma string:

','.join(map(str,li2))

Há algumas escolhas. Primeiro, você pode simplesmente criar uma nova lista e adicione o conteúdo de cada lista para isso:

li2 = []
for sublist in li:
    li2.extend(sublist)

Como alternativa, você pode usar a função itertools do módulo chain, que produz um iterable contendo todos os itens em vários iterables:

import itertools
li2 = list(itertools.chain(*li))

Se você tomar essa abordagem, você pode produzir a corda sem criar uma lista intermediária:

s = ",".join(itertools.chain(*li))

O meu favorito, eo mais curto, é o seguinte:

li2 = sum(li, [])

e

s = ','.join(li2)

EDIT: uso sum vez de reduce, (! Graças Thomas Wouters )

Para torná-lo um uso lista achatada quer:

  1. http://code.activestate.com/recipes/121294/
  2. http://code.activestate.com/recipes/363051/

Então, join para torná-lo uma corda.

Para o segundo, há um built-in método de string para fazer isso:

>>> print ','.join(str(x) for x in li2)
"0,1,2,3,4,5,6,7,8"

Para o primeiro, você pode usar juntar-se dentro de uma compreensão da lista:

>>> print ",".join([",".join(str(x) for x in li])
"0,1,2,3,4,5,6,7,8"

Mas é mais fácil de usar itertools.flatten:

>>> import itertools
>>> print itertools.flatten(li)
[0,1,2,3,4,5,6,7,8]
>>> print ",".join(str(x) for x in itertools.flatten(li))
"0,1,2,3,4,5,6,7,8"

NB: itertools é um módulo que ajuda você a lidar com tarefas comuns com iterators tais como listas, tuplas ou string ... É útil porque não armazena uma cópia da estrutura que você está trabalhando, mas processar os itens um por um.

EDIT: engraçado, eu estou aprendendo muita maneira de fazê-lo. Quem disse que só havia uma boa maneira de fazê-lo?

Existem muitas maneiras de fazer este problema. Eu gosto Numpy 's ferramentas porque é normalmente já importado em tudo que faço. No entanto, se você não estiver usando Numpy para qualquer outra coisa isso provavelmente não é um bom método.

import numpy
li = [[0,1,2],[3,4,5],[6,7,8]]
li2=li[0] #first element of array to merge
i=1 
while i<len(li):
    li2=numpy.concatenate((li2,li[i]))
    i+=1
print li2

Isto imprimir [0 1 2 3 4 5 6 7 8] e, em seguida, você pode converter isso em sua seqüência também.

import itertools
itertools.flatten( li )
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top