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.
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]".
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 jestmap(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ś.
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:
defget_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 ,.
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.
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:
@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'
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
print(["Sam"])
wywołaniarepr("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ędzystr
irepr
lub Pythonstr
ilist
s, aby uzyskać więcej informacji.Odpowiedzi:
W Pythonie 2:
mylist = ['x', 3, 'b'] print '[%s]' % ', '.join(map(str, mylist))
W Pythonie 3 (gdzie
print
jest 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ągstr.join()
. Następnie%
operator formatowania ciągu zastępuje ciąg in zamiast%s
in"[%s]"
.źródło
map
funkcji do wywołaniastr
każdego elementumylist
, tworząc nową listę ciągów, z którymi następnie łączy się w jeden ciągstr.join
. Następnie używa%
operatora formatowania ciągu, aby podstawić ciąg in zamiast%s
in"[%s]"
."[{0}]".format(", ".join(str(i) for i in mylist))
map(f, xs)
(lubimap
w python2.x) zamiast(f(x) for x in xs)
, kiedyf
jest predefiniowanym wywoływanym; który zwykle wykonuje mniej kodów bajtowych i jest zwykle bardziej zwarty. Z pewnością nie jestmap(lambda x:..., xs)
to dużo gorsze niż(... for x in xs)
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ś.
źródło
Używając tylko druku:
>>> l = ['x', 3, 'b'] >>> print(*l, sep='\n') x 3 b >>> print(*l, sep=', ') x, 3, b
źródło
Jeśli używasz Python3:
print('[',end='');print(*L, sep=', ', end='');print(']')
źródło
print(end='['); print(*l, sep=', ', end=']\n')
Zamiast używać
map
, polecam użycie wyrażenia generatora z możliwościąjoin
akceptacji iteratora:def get_nice_string(list_or_iterator): return "[" + ", ".join( str(x) for x in list_or_iterator) + "]"
Tutaj
join
jest funkcją składową klasy stringstr
. 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,
.źródło
", ".join( str(x) for x in list_or_iterator).join('[]')
Możesz usunąć wszystkie niechciane znaki z ciągu, używając jego
translate()
metody z argumentemNone
jakotable
argumentem, a następnie ciągiem zawierającym znaki, które chcesz usunąć jakodeletechars
argument.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
string
modułu,translate()
ponieważ możliwość przekazaniaNone
jakotable
argumentu 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.źródło
lst = ["it isn't", 3, 'b']
==>["it isnt", 3, b]
a także zlst = ['it isn\'t', 3, 'b']
Oto interaktywna sesja pokazująca niektóre kroki w jednej linijce @ TokenMacGuy. Najpierw używa
map
funkcji 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,join
aby 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
join
jest 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'
źródło
Używanie
.format
do formatowania ciągów,mylist = ['x', 3, 'b'] print("[{0}]".format(', '.join(map(str, mylist))))
Wynik:
[x, 3, b]
Wyjaśnienie:
map
służy do mapowania każdego elementu listy nastring
typ.,
separatorem.[
i]
w instrukcji print, aby wyświetlić nawiasy klamrowe.Odniesienie:
.format
do formatowania ciągów znaków PEP-3101źródło
.format
najbardziej pytonicznego sposobu. Ale oczywiście akceptuję nieporozumienia. ;)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
format
metody. Żadnego śladustr
, 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]
źródło