Jak „poprawnie” wydrukować listę?

95

Mam więc listę:

['x', 3, 'b']

Chcę, aby wynik był:

[x, 3, b]

Jak mogę to zrobić w Pythonie?

Jeśli tak str(['x', 3, 'b']), dostaję taki z cudzysłowami, ale nie chcę cytatów.

Obaid
źródło
Aby wyjaśnić, dlaczego lista nie jest „poprawnie” wydrukowana, print(["Sam"])wywołania repr("Sam"), które zwracają 'Sam'(w cudzysłowach), w przeciwieństwie do wywołań print("Sam")i wywołań w języku Python, str("Sam")które zwracają Sam(bez cudzysłowów). Zobacz różnicę między strirepr lub Python stri lists, aby uzyskać więcej informacji.
Anonimowy

Odpowiedzi:

189

W Pythonie 2:

mylist = ['x', 3, 'b']
print '[%s]' % ', '.join(map(str, mylist))

W Pythonie 3 (gdzie printjest już funkcją wbudowaną, a nie funkcją składni):

mylist = ['x', 3, 'b']
print('[%s]' % ', '.join(map(str, mylist)))

Obie wracają:

[x, 3, b]

Jest to użycie map()funkcji do wywołania str dla każdego elementu mylist , tworząc nową listę ciągów, która jest następnie łączona w jeden ciąg str.join(). Następnie %operator formatowania ciągu zastępuje ciąg in zamiast %sin "[%s]".

SingleNegationElimination
źródło
4
Dziękuję, że działa świetnie. Czy możesz wyjaśnić trochę szczegółowo, co robisz w drugiej linijce? Jestem nowy w Pythonie.
Obaid
19
Używa mapfunkcji do wywołania strkażdego elementu mylist, tworząc nową listę ciągów, z którymi następnie łączy się w jeden ciąg str.join. Następnie używa %operatora formatowania ciągu, aby podstawić ciąg in zamiast %sin "[%s]".
li.davidm
6
Inny sposób na zrobienie tego, może trochę nowocześniejszy: "[{0}]".format(", ".join(str(i) for i in mylist))
Jack O'Connor,
2
wolę map(f, xs)(lub imapw python2.x) zamiast (f(x) for x in xs), kiedy fjest predefiniowanym wywoływanym; który zwykle wykonuje mniej kodów bajtowych i jest zwykle bardziej zwarty. Z pewnością nie jest map(lambda x:..., xs) to dużo gorsze niż(... for x in xs)
SingleNegationElimination
1
@ user1767754: naprawdę? Połączyć?
SingleNegationElimination
19

To jest prosty kod, więc jeśli jesteś nowy, powinieneś go łatwo zrozumieć.

    mylist = ["x", 3, "b"]
    for items in mylist:
        print(items)

Drukuje je wszystkie bez cytatów, tak jak chciałeś.

reemer9997
źródło
15

Używając tylko druku:

>>> l = ['x', 3, 'b']
>>> print(*l, sep='\n')
x
3
b
>>> print(*l, sep=', ')
x, 3, b
Fin
źródło
14

Jeśli używasz Python3:

print('[',end='');print(*L, sep=', ', end='');print(']')
Kabie
źródło
1
co tu robi print (* L)?
sandeeps
1
Jestem tym zdezorientowany. Czy długi typ danych w jakiś sposób filtruje listę?
dval
Bardziej zwięzła wersja byłabyprint(end='['); print(*l, sep=', ', end=']\n')
Anonimowy
9

Zamiast używać map, polecam użycie wyrażenia generatora z możliwością joinakceptacji iteratora:

def get_nice_string(list_or_iterator):
    return "[" + ", ".join( str(x) for x in list_or_iterator) + "]"

Tutaj joinjest funkcją składową klasy string str. Pobiera jeden argument: listę (lub iterator) ciągów, a następnie zwraca nowy łańcuch ze wszystkimi elementami połączonymi w tym przypadku przez ,.

Seth Johnson
źródło
2
Dobra optymalizacja dla Pythona 2, ponieważ map zwraca listę w 2.x. Zwraca generator w 3.x, więc nie pomaga tam tak bardzo.
Tom Zych,
7
Wróciłbym ", ".join( str(x) for x in list_or_iterator).join('[]')
eyquem
@eyquem: Sprytne, nie widziałem wcześniej złączenia używanego w ten sposób. Mimo to jest to trochę bardziej nieprzejrzyste dla początkujących (ponieważ używasz właściwości, że ciąg jest iterowalnym kontenerem jednoznakowych ciągów).
Seth Johnson,
6

Możesz usunąć wszystkie niechciane znaki z ciągu, używając jego translate()metody z argumentem Nonejako tableargumentem, a następnie ciągiem zawierającym znaki, które chcesz usunąć jako deletecharsargument.

lst = ['x', 3, 'b']

print str(lst).translate(None, "'")

# [x, 3, b]

Jeśli używasz wersji Pythona wcześniejszej niż 2.6, musisz zamiast tego użyć funkcji stringmodułu, translate()ponieważ możliwość przekazania Nonejako tableargumentu nie została dodana przed Pythonem 2.6. Używanie go wygląda następująco:

import string

print string.translate(str(lst), None, "'")

Korzystanie z tej string.translate()funkcji będzie działać również w wersji 2.6+, więc korzystanie z niej może być lepsze.

martineau
źródło
2
Niestety: lst = ["it isn't", 3, 'b']==> ["it isnt", 3, b]a także zlst = ['it isn\'t', 3, 'b']
eyquem
1
@eyquem: Tak, unikanie usuwania znaków, które faktycznie są częścią twoich danych (a nie są używane do ich rozgraniczenia), naturalnie wymagałoby nieco bardziej skomplikowanej / innej logiki, jeśli jest taka możliwość.
martineau,
3

Oto interaktywna sesja pokazująca niektóre kroki w jednej linijce @ TokenMacGuy. Najpierw używa mapfunkcji do konwersji każdej pozycji na liście na łańcuch (właściwie tworzy nową listę, a nie konwertuje pozycje ze starej listy). Następnie używa metody string, joinaby połączyć te ciągi', ' między nimi. Reszta to po prostu formatowanie napisów, co jest dość proste. (Edycja: to wystąpienie jest proste; ogólnie formatowanie ciągów może być nieco złożone).

Zauważ, że użycie joinjest prostym i wydajnym sposobem na zbudowanie łańcucha z kilku podciągów, znacznie bardziej wydajnym niż robienie tego poprzez sukcesywne dodawanie ciągów do łańcuchów, co wiąże się z dużym kopiowaniem za kulisami.

>>> mylist = ['x', 3, 'b']
>>> m = map(str, mylist)
>>> m
['x', '3', 'b']
>>> j = ', '.join(m)
>>> j
'x, 3, b'
Tom Zych
źródło
2

Używanie .formatdo formatowania ciągów,

mylist = ['x', 3, 'b']
print("[{0}]".format(', '.join(map(str, mylist))))

Wynik:

[x, 3, b]

Wyjaśnienie:

  1. mapsłuży do mapowania każdego elementu listy na stringtyp.
  2. Elementy są łączone w łańcuch z ,separatorem.
  3. Używamy [i ]w instrukcji print, aby wyświetlić nawiasy klamrowe.

Odniesienie: .formatdo formatowania ciągów znaków PEP-3101

Ani Menon
źródło
Świetny! Używam .formatnajbardziej pytonicznego sposobu. Ale oczywiście akceptuję nieporozumienia. ;)
kochany.przez Jezusa
0

Zainspirował mnie @AniMenon, aby napisać bardziej ogólne rozwiązanie w Pythonie.

mylist = ['x', 3, 'b']
print('[{}]'.format(', '.join(map('{}'.format, mylist))))

Używa tylko formatmetody. Żadnego śladu str, a pozwala na precyzyjne dostrojenie formatu elementów. Na przykład, jeśli masz liczby zmiennoprzecinkowe jako elementy listy, możesz dostosować ich format, dodając specyfikator konwersji, w tym przypadku:.2f

mylist = [1.8493849, -6.329323, 4000.21222111]
print("[{}]".format(', '.join(map('{:.2f}'.format, mylist))))

Wynik jest całkiem przyzwoity:

[1.85, -6.33, 4000.21]
kochany przez Jezusa
źródło