Maneira Pythônica de imprimir itens de lista

114

Gostaria de saber se existe uma maneira melhor de imprimir todos os objetos em uma lista Python do que esta:

myList = [Person("Foo"), Person("Bar")]
print("\n".join(map(str, myList)))
Foo
Bar

Eu li que assim não é muito bom:

myList = [Person("Foo"), Person("Bar")]
for p in myList:
    print(p)

Não existe algo como:

print(p) for p in myList

Se não, minha pergunta é ... por quê? Se podemos fazer esse tipo de coisa com listas abrangentes, por que não como uma simples declaração fora de uma lista?

Guillaume Voiron
fonte
3
De onde você teve a impressão de que usar for p in myList"não era muito bom"?
Jon Clements
@JonClements: chrisarndt.de/talks/rupy/2008/output/slides.html
Guillaume Voiron
@pelotasplus: de jeito nenhum :) E, a propósito, eu realmente não gosto da minha primeira versão que não é "legível"
Guillaume Voiron

Respostas:

220

Supondo que você esteja usando Python 3.x:

print(*myList, sep='\n')

Você pode obter o mesmo comportamento no Python 2.x usando from __future__ import print_function, conforme observado por mgilson nos comentários.

Com a instrução print no Python 2.x, você precisará de algum tipo de iteração, em relação à sua pergunta sobre print(p) for p in myListnão funcionar, você pode apenas usar o seguinte, que faz a mesma coisa e ainda é uma linha:

for p in myList: print p

Para uma solução que usa '\n'.join(), eu prefiro compreensões de lista e geradores, map()então provavelmente usaria o seguinte:

print '\n'.join(str(p) for p in myList) 
Andrew Clark
fonte
3
E se não, você pode from __future__ import print_functionno python2.6 e mais recente.
mgilson
em python 2x, usar map é um pouco mais rápido do que usar join em uma compreensão de lista.
Juan Carlos Moreno
1
Por que o downvote, é realmente devido à diferença de velocidade entre map()e um gerador? O criador do Python também prefere compreensões e geradoresmap() .
Andrew Clark,
Eu não votei contra você. Conheço aquele post do GVR que era a maneira dele de dizer, na época, como as versões futuras do python não iriam incluir, mas acabaram ficando.
Juan Carlos Moreno
1
Eles permaneceram no Python 3.x, mas seu ponto naquele artigo é que [F(x) for x in S]é mais claro do que map(F, S). O desempenho não é abordado aqui, mas eu esperaria que a diferença de velocidade fosse insignificante. De qualquer forma, eu estava confuso sobre o downvote, desculpe, pensei que era você!
Andrew Clark,
28

Eu uso isso o tempo todo :

#!/usr/bin/python

l = [1,2,3,7] 
print "".join([str(x) for x in l])
lucasg
fonte
1
Para adicionar format(), substitua str(x)por uma string de formato:print " ".join(["{:02d}".format(x) for x in l])
ChrisFreeman
8

[print(a) for a in list] vai dar um monte de tipos Nenhum no final embora ele imprima todos os itens

ytpillai
fonte
é isso que tenho usado até agora. É uma linha, muito clara e expressiva, mas linter reclamações "Expressão não atribuída a nada"
alete
1
Se você quiser rastrear o linter, pode fazer uma função separada que o imprime e retorna algum valor estúpido e chamar essa função na compreensão da lista
ytpillai
3

Para Python 2. *:

Se você sobrecarregar a função __str __ () para sua classe Person, você pode omitir a parte com map (str, ...). Outra maneira de fazer isso é criar uma função, assim como você escreveu:

def write_list(lst):
    for item in lst:
        print str(item) 

...

write_list(MyList)

Existe no Python 3. * o argumento sep para a função print (). Dê uma olhada na documentação.

gukoff
fonte
3

Expandindo a resposta de @lucasg (inspirado no comentário que recebeu):

Para obter uma saída de lista formatada , você pode fazer algo ao longo destas linhas:

l = [1,2,5]
print ", ".join('%02d'%x for x in l)

01, 02, 05

Agora o ", "fornece o separador (apenas entre os itens, não no final) e a string de formatação '02d'combinada com %xfornece uma string formatada para cada item x- neste caso, formatado como um inteiro com dois dígitos, preenchido à esquerda com zeros.

Floris
fonte
2

Para exibir cada conteúdo, eu uso:

mylist = ['foo', 'bar']
indexval = 0
for i in range(len(mylist)):     
    print(mylist[indexval])
    indexval += 1

Exemplo de uso em uma função:

def showAll(listname, startat):
   indexval = startat
   try:
      for i in range(len(mylist)):
         print(mylist[indexval])
         indexval = indexval + 1
   except IndexError:
      print('That index value you gave is out of range.')

Espero ter ajudado.

ShinyMemes
fonte
1
Apenas para observação, verifique a resposta acima de você. Você usa um intervalo, que fornece um valor de índice, i, mas usa outra variável, indexval, como seu índice ?? Você está lutando contra a simplicidade do python. para val em minha_lista: imprimir val faz o mesmo que você
BretD
1

Acho que é o mais conveniente se você quiser apenas ver o conteúdo da lista:

myList = ['foo', 'bar']
print('myList is %s' % str(myList))

Simples, fácil de ler e pode ser usado junto com a string de formato.

Rongzhao Zhang
fonte
1

A pergunta da OP é: existe algo como o seguinte, se não, por que

print(p) for p in myList # doesn't work, OP's intuition

a resposta é, ele existe, o que é:

[p for p in myList] #works perfectly

Basicamente, use []para compreensão da lista e printevite evitar a impressão None. Para ver por que as printimpressões, Noneveja isto

Gaurav Singhal
fonte
1

Recentemente, fiz um gerador de senha e, embora eu seja MUITO NOVO no python, criei isso como uma forma de exibir todos os itens em uma lista (com pequenas edições para atender às suas necessidades ...

    x = 0
    up = 0
    passwordText = ""
    password = []
    userInput = int(input("Enter how many characters you want your password to be: "))
    print("\n\n\n") # spacing

    while x <= (userInput - 1): #loops as many times as the user inputs above
            password.extend([choice(groups.characters)]) #adds random character from groups file that has all lower/uppercase letters and all numbers
            x = x+1 #adds 1 to x w/o using x ++1 as I get many errors w/ that
            passwordText = passwordText + password[up]
            up = up+1 # same as x increase


    print(passwordText)

Como eu disse, sou MUITO NOVO em Python e tenho certeza de que é uma maneira desajeitada para um especialista, mas estou aqui apenas para outro exemplo

Nate Baker
fonte
0

Supondo que você esteja bem com sua lista sendo impressa [1,2,3], uma maneira fácil em Python3 é:

mylist=[1,2,3,'lorem','ipsum','dolor','sit','amet']

print(f"There are {len(mylist):d} items in this lorem list: {str(mylist):s}")

Executá-lo produz a seguinte saída:

Existem 8 itens nesta lista lorem: [1, 2, 3, 'lorem', 'ipsum', 'dolor', 'sentar', 'amet']

Aethalides
fonte