سؤال

أحاول تعيين قائمة في عرافة، ثم استخدم القائمة في مكان آخر. في بيثون 2.6، كان هذا سهلا:

أ: بيثون 2.6:

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

ومع ذلك، في بيثون 3.1، عودة أعلاه كائن خريطة.

ب: بيثون 3.1:

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

كيف يمكنني استرجاع القائمة المعينة (كما في أ أعلاه) على بيثون 3.x؟

بدلا من ذلك، هل هناك طريقة أفضل للقيام بذلك؟ يحتوي كائن القائمة الأولية على حوالي 45 عنصر ومعرف ترغب في تحويلها إلى Hex.

هل كانت مفيدة؟

المحلول

افعل هذا:

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

في Python 3+، العديد من العمليات التي تتسبب في إرجاع iPerables Itersators أنفسهم. في معظم الحالات، ينتهي هذا بحفظ الذاكرة، وينبغي أن تجعل الأمور تسرع بشكل أسرع.

إذا كان كل ما ستقوم به هو تكرر هذه القائمة في نهاية المطاف، فلا حاجة لتحويلها إلى قائمة، لأنه لا يزال بإمكانك تكرار map كائن مثل ذلك:

# Prints "ABCD"
for ch in map(chr,[65,66,67,68]):
    print(ch)

نصائح أخرى

لماذا لا تفعل هذا:

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

إنه يطلق عليه فهم قائمة. يمكنك العثور على الكثير من المعلومات على Google، ولكن إليك الرابط إلى وثائق Python (2.6) في الفهم. وبعد قد تكون أكثر اهتماما بيثون 3 documenation, ، على أية حال.

جديد وأنيق في بيثون 3.5:

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

بفضل تعميمات إضافية تفريغها

تحديث

دائما البحث عن طرق أقصر، اكتشفت أن هذا يعمل أيضا:

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

تفريغ الأعمال في tuples أيضا. لاحظ الفاصلة في النهاية. هذا يجعلها tuple من عنصر واحد. وهذا هو، إنه ما يعادل (*map(chr, [66, 53, 0, 94]),)

انها أقصر من سحر واحد فقط من الإصدار مع الأقواس القائمة، ولكن في رأيي، من الأفضل أن أكتب، لأنك تبدأ في المقدمة مباشرة مع العلامة النجمية - بناء جملة التوسع، لذلك أشعر أن الأمر أكثر ليونة على العقل. :)

تحتوي وظيفة الخريطة الإرجاع على ميزة توفير الكتابة، خاصة أثناء الجلسات التفاعلية. يمكنك تحديد lmap وظيفة (على تشبيه Python2's imap) قائمة العودة:

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

ثم الاتصال lmap بدلا من map سوف تفعل الوظيفة:lmap(str, x) أقصر من 5 أحرف (30٪ في هذه الحالة) من list(map(str, x)) وبالتأكيد أقصر من [str(v) for v in x]. وبعد قد تخلق وظائف مماثلة ل filter جدا.

كان هناك تعليق على السؤال الأصلي:

أود أن أقترح إعادة تسمية للحصول على الخريطة () لإرجاع قائمة في Python 3. * كما ينطبق على جميع إصدارات Python3. هل هناك طريقة للقيام بذلك؟ - Meawoppl 24 يناير الساعة 17:58

هو - هي يكون ممكن للقيام بذلك، لكنها فكرة سيئة للغاية. فقط للمتعة، إليك كيف قد (ولكن لا ينبغي) افعلها:

__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

أنا لست على دراية بيثون 3.1، ولكن هل هذا العمل؟

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

تحويل تعليقي القديم للحصول على رؤية أفضل: للحصول على "طريقة أفضل للقيام بذلك" بدون map كليا، إذا كانت مدخلاتك معروفة بأنها محلات ASCII، فهي أسرع بكثير لتحويلها bytes و فكيب، لا bytes(list_of_ordinals).decode('ascii'). وبعد هذا يحصل لك str من القيم، ولكن إذا كنت بحاجة إلى list لتحمل أو مثل، يمكنك فقط تحويله (ولا يزال بشكل أسرع). على سبيل المثال، في ipython microbenchmarks تحويل 45 مدخلات:

>>> %%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)

إذا تركتها ك str, ، يستغرق حوالي 20٪ من وقت الأسرع map حلول؛ حتى التحويل مرة أخرى إلى القائمة لا يزال أقل من 40٪ من الأسرع map المحلول. السائبة التحويل عبر bytes و bytes.decode ثم التحويل بالجملة العودة إلى list يحفظ الكثير من العمل، لكن كما لوحظ، يعمل فقط إذا كانت جميع المدخلات الخاصة بك هي عروض ASCII (أو المرتبات في بعض البايت واحد لكل حرف ترميز محدد، على سبيل المثال latin-1).

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

الخريطة (Func، iSixables) -> كائن الخريطة جعل جهاز كمتكر يحسب الدالة باستخدام الوسائط من كل من المؤخرات. يتوقف عند استنفاد أقصر قابلة للتكرار.

"اصنع مكتور"

يعني أنه سيعود للماء.

"الذي يحسب الدالة باستخدام الوسائط من كل من المؤشر الثالثة الوجئية"

يعني أن الوظيفة التالية () من المحفز ستتناول قيمة واحدة من كل تجربة تابعة وتمويل كل منها إلى معلمة موضعية واحدة من الوظيفة.

لذلك يمكنك الحصول على مقاومة للماء من الخريطة () funtion و JSUT تمريرها إلى القائمة () الوظيفة المدمجة أو استخدام قائمة الفهم.

بالإضافة إلى الإجابات أعلاه في Python 3, ، قد ننشئ ببساطة list من قيم النتائج من map كما

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

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

قد نعيم بمثال آخر حيث تم التعامل معه، ويمكن أيضا التعامل مع العمليات على الخريطة بطريقة مماثلة مثل regex مشكلة، يمكننا كتابة الوظيفة للحصول عليها list العناصر إلى الخريطة والحصول على النتائج في نفس الوقت. السابق.

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]

باستخدام قائمة الفهم في Python وأداة مساعدة وظيفة الخريطة الأساسية، يمكن للمرء القيام بذلك أيضا:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top