2017-01-27 14 views
10

Say Mam funkcjiJak interpolować listę w łańcuchu znaków w języku Python?

def foo(): return [1, 2, 3] 

Chcę interpolacji wynik funkcji w ciąg, aby uzyskać "001 002 003". Próbowałem tego:

f"{*foo():03d 03d 03d}" 

Ale wyprodukował SyntaxError: can't use starred expression here. Czy mogę to zrobić za pomocą ciągi f?

+2

'f" {”” .join (mapa ('{: 03D}' .format, foo()))} "'? –

+0

Ta sugestia działa, ale ciąg f jest nadmiarowy, a składnia wulgarna. Można użyć podobnej odpowiedzi przez @ ev-kounis, bez ciągów f. Wygląda na to, że ciągi-f nie poprawiają drukowania list. – divenex

Odpowiedz

8

jest tym, czego szukasz?

str_repr = ' '.join(map('{:03d}'.format, foo())) 
print(str_repr) # prints: 001 002 003 

może najlepszą rzeczą tego rozwiązania jest to, że działa z każdym długości listy i przy minimalnym szczypanie można zmienić format wyjściowy też.

+0

Działa to, ale ** nie ** korzysta z ciągów f na żądanie. Może to być rzeczywiście najlepsze dostępne rozwiązanie Pythona, ale jest pełne. Chciałbym coś takiego jak to "f" {foo(): 03d} "" wkradłoby się na listę. – divenex

3

Po pierwsze, operator * -operator może rozpakować iterables tylko w kilku specyficznych kontekstach, takich jak wywołanie funkcji, wyświetlanie listy itp. Nie można go użyć bezpośrednio w symbolu zastępczym string. Chociaż można użyć str.format() takiego:

"{:03d} {:03d} {:03d}".format(*foo()) 

Po drugie, nie można generalnie Format/interpolacji wielu wartości w jednym zastępczy. trzeba by użyć osobnego zastępczy dla każdej wartości:

lst = foo() 
f"{lst[0]:03d} {lst[1]:03d} {lst[2]:03d}" 
+0

"the * -operator może rozpakować iterables tylko w wywołaniu funkcji" To nie prawda: '[1, 3, * foo()]' działa. – L3viathan

+0

* "nie można sformatować/interpolować wielu wartości w jednym miejscu zastępczym" * nie jest tak, jeśli użyje się 'map' i' {} .format' jako funkcji –

+0

@ L3viathan: good point, updated. –

1

Operator * (podobne zasady istnieją **) może być używany tylko wewnątrz:

  • wywołanie funkcji: foo(*bar)
  • lista, krotka, lub ustawić dosłowny: ['foo', *bar]
  • zadanie: foo, *bar = range(10)

Nie jest to expression i dlatego nie można go używać w nawiasach klamrowych.

0

W przypadku list ciągi-f nie wydają się dodawać wiele do tego, co było już możliwe bez nich. Alternatywą, nieco prostsze rozwiązanie bez f-strings i bez .join, który działa dla dowolnej długości listy, jest następujący

a = foo() 
str_repr = ("{:03d} "*len(a)).format(*a) 
print(str_repr) # prints: 001 002 003 
Powiązane problemy