Python 3'te bir liste döndürmek için bir harita() alma.x

bir listeyi hex'e eşlemeye çalışıyorum ve ardından listeyi başka bir yerde kullanmaya çalışıyorum. Python 2.6'da bu kolaydı:

A: Python 2.6:

>>> map(chr, [66, 53, 0, 94])
['B', '5', '\x00', '^']

ancak, Python 3.1, yukarıdaki bir harita nesnesi döndürür.

B: Python 3.1:

>>> map(chr, [66, 53, 0, 94])
<map object at 0x00AF5570>

eşlenen listeyi ( a yukarıdaki gibi) Python 3'te nasıl alabilirim.x?

alternatif olarak, bunu yapmanın daha iyi bir yolu var mı? İlk liste nesnem yaklaşık 45 öğeye sahiptir ve bunları hex'e dönüştürmek ister.

366
tarihinde sordu vaultah 2009-08-20 04:27:26
kaynak

8 ответов

bunu yap:

list(map(chr,[66,53,0,94]))

Python 3+ ' da, yinelemeler üzerinde yineleyen birçok işlem yineleyicileri kendileri döndürür. Çoğu durumda, bu bellek tasarrufu biter ve işler daha hızlı gitmek yapmak gerekir.

yapmanız gereken tek şey sonunda bu liste üzerinde yinelenirse, bir listeye dönüştürmeye bile gerek yoktur, çünkü map nesnesi üzerinde hala yinelenebilirsiniz:

# Prints "ABCD"
for ch in map(chr,[65,66,67,68]):
    print(ch)
566
cevap Triptych 2009-08-20 04:42:10
kaynak

neden bunu yapmıyorsun:

[chr(x) for x in [66,53,0,94]]

buna bir liste anlama denir. Google'da bol miktarda bilgi bulabilirsiniz, ancak işte list comprehensions Python (2.6) belgelerine bağlantı . Yine de Python 3 documenation ile daha fazla ilgilenebilirsiniz.

80
cevap Mark Rushakoff 2009-08-20 04:36:32
kaynak

Python 3.5 yeni ve temiz:

[*map(chr, [66, 53, 0, 94])]

teşekkürler ek açma genellemeler

58
cevap Israel Unterman 2016-08-01 18:18:41
kaynak

liste dönen harita fonksiyonu, özellikle interaktif oturumlar sırasında, yazarak tasarruf avantajı vardır. lmap işlevini tanımlayabilirsiniz (python2'nin imap benzetmesi üzerine ) liste döndürür:

lmap = lambda func, *iterable: list(map(func, *iterable))

daha sonra lmap yerine map çağrısı işi yapacak: lmap(str, x) , list(map(str, x)) den 5 karakter (bu durumda %30) daha kısadır ve [str(v) for v in x] den kesinlikle daha kısadır . Için benzer işlevler oluşturabilirsiniz filter de.

orijinal soruya bir yorum yapıldı:

Python 3'te bir liste döndürmek için map() almak için bir rename öneririm.* tüm Python3 sürümleri için geçerli olduğu gibi. Bunu yapmanın bir yolu var mı? - meawoppl 24 Ocak 17:58

bu olduğunu bunu yapmak mümkün, ama çok kötü bir fikir. Sadece eğlence için, işte nasıl olabilir ( ama olmamalıdır ) bunu:

__global_map = map #keep reference to the original map
lmap = lambda func, *iterable: list(__global_map(func, *iterable)) # using "map" here will cause infinite recursion
map = lmap
x = [1, 2, 3]
map(str, x) #test
map = __global_map #restore the original map and don't do that again
map(str, x) #iterator
18
cevap Boris Gorelik 2018-05-25 21:01:34
kaynak

Python 3.1'e aşina değilim, ancak bu işe yarayacak mı?

[chr(x) for x in [66, 53, 0, 94]]
11
cevap Andrew Keeton 2009-08-20 04:28:44
kaynak

dönüştürme benim eski yorum daha iyi görünürlük için: map olmadan" bunu yapmak için daha iyi bir yol " için tamamen, GİRİŞLERİNİZ ASCII ordinals olduğu biliniyorsa, bytes ve decode, bytes(list_of_ordinals).decode('ascii') dönüştürmek genellikle çok daha hızlı . Bu, değerlerin str sini alır, ancak mutabilite veya benzerleri için list ye ihtiyacınız varsa, sadece dönüştürebilirsiniz (ve hala daha hızlı). Örneğin, ipython microbenchmarks. 45 giriş:

>>> %%timeit -r5 ordinals = list(range(45))
... list(map(chr, ordinals))
...
3.91 µs ± 60.2 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each)

>>> %%timeit -r5 ordinals = list(range(45))
... [*map(chr, ordinals)]
...
3.84 µs ± 219 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each)

>>> %%timeit -r5 ordinals = list(range(45))
... [*bytes(ordinals).decode('ascii')]
...
1.43 µs ± 49.7 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)

>>> %%timeit -r5 ordinals = list(range(45))
... bytes(ordinals).decode('ascii')
...
781 ns ± 15.9 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)

bir str olarak bırakırsanız, en hızlı map çözümlerinin zamanının ~%20'sini alır; listeye geri dönseniz bile, en hızlı map çözümünün %40'ından daha azdır. Toplu dönüştürme bytes ve bytes.decode sonra toplu dönüştürme geri list çok iş kaydeder, ama belirtildiği gibi, sadece tüm girişler ASCII ordinals (veya ordinals karakter başına bazı bir bayt) ise çalışır yerel ayar özgü kodlama, örneğin latin-1 ).

3
cevap ShadowRanger 2017-11-08 07:52:46
kaynak
list(map(chr, [66, 53, 0, 94]))

map (func, * iterables) - > harita nesnesi Bağımsız değişkenleri kullanarak işlevi hesaplayan bir yineleyici yapın yinelemelerin her biri. En kısa yinelenebilir tükendiğinde durur.

"bir yineleyici yap "

, bir yineleyici döndüreceği anlamına gelir.

"

" yinelemelerin her birinden bağımsız değişkenleri kullanarak işlevi hesaplar

, yineleyicinin sonraki() işlevinin her bir yinelemenin bir değerini alacağı ve her birini işlevin bir konumsal parametresine geçireceği anlamına gelir.

böylece harita() işlevinden bir yineleyici elde edersiniz ve jsut bunu liste () yerleşik işlevine geçirir veya liste kavrayışlarını kullanır.

0
cevap Invader 2017-11-07 12:04:30
kaynak

yukarıdaki cevaplara ek olarak Python 3 , list olarak map den list sonuç değerlerinin list oluşturabiliriz

li = []
for x in map(chr,[66,53,0,94]):
    li.append(x)

print (li)
>>>['B', '5', '\x00', '^']

vurulduğum başka bir örnekle genelleştirebiliriz, Haritadaki işlemler de regex probleminde olduğu gibi benzer şekilde ele alınabilir, list elde etmek için işlev yazabiliriz.eşlemek ve aynı zamanda sonuç kümesi elde etmek. Eski.

b = 'Strings: 1,072, Another String: 474 '
li = []
for x in map(int,map(int, re.findall('\d+', b))):
    li.append(x)

print (li)
>>>[1, 72, 474]
0
cevap Harry_pb 2018-06-15 19:35:30
kaynak