بالنظر إلى قائمة وقطعة صغيرة ، كيف يمكنني إرجاع القيم في المؤشرات الصحيح؟

StackOverflow https://stackoverflow.com/questions/3555375

سؤال

أبدأ بالقائمة التالية s و bitmask b:

s = ['baa', 'baa', 'black', 'sheep', 'have', 'you', 'any', 'wool']
b = [1, 0, 0, 0, 1, 1, 1, 0] # or any iterable with boolean values

كيف أكتب بعض الوظائف apply_bitmask(s, b) بحيث يعود

['baa', 'have', 'you', 'any']
هل كانت مفيدة؟

المحلول

بيثون 3.1 itertools.compress (أو بيثون 2.7 إذا لم تقم بالترقية بعد) فعل ذلك بالضبط (فهم القائمة هو قرب حقيقي):

import itertools
filtered = itertools.compress(s, b)

لاحظ أن هذا ينتج مؤلفًا ، وليس قائمة. يحفظ الذاكرة ، ولكن إذا كنت بحاجة إلى تكرارها عدة مرات أو استخدام المؤشرات ، فيمكنك دائمًا استخدامها list(itertools.compress(s, b)). لا يزال أقصر.

نصائح أخرى

[ item for item, flag in zip( s, b ) if flag == 1 ]

يمكنك استخدام قائمة الشمولية:

newList = [word for (word, mask) in zip(s,b) if mask]
# Note: Could also use 'if mask == blah', if mask is not a boolean-compatible type.

هذا أولاً يأخذ القائمتين الأصليتين ، و ZIPS معًا ، بحيث تحصل على قائمة (مؤقت - لا يزال هذا داخل القائمة [('baa',1), ('baa',0),...]. ثم فقط الكلمات التي لها قناع 1 (if mask == 1تضاف إلى newList.

آخر يأخذ على فهم القائمة ، مع استخدام Zip

newList = [item for i, item in enumerate(s) if b[i]]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top