كيف يمكنني جمع القيمة الأولى في كل صف في قائمة الصفوف في بايثون؟
سؤال
لدي قائمة من الصفوف (الأزواج دائمًا) مثل هذا:
[(0, 1), (2, 3), (5, 7), (2, 1)]
أرغب في العثور على مجموع العناصر الأولى في كل زوج، أي:
0 + 2 + 5 + 2
كيف يمكنني القيام بذلك في بايثون؟في الوقت الحالي أقوم بالتكرار عبر القائمة:
sum = 0
for pair in list_of_pairs:
sum += pair[0]
لدي شعور بأنه يجب أن تكون هناك طريقة أكثر بايثونية.
المحلول
وإصدار متوافق مع بايثون 2.3 هو
sum([pair[0] for pair in list_of_pairs])
وأو في الإصدارات الأخيرة من بيثون، انظر هذه الإجابة أو <وأ href = "https://stackoverflow.com / أ / 10255912/56541 "> هذا واحد .
نصائح أخرى
sum(i for i, j in list_of_pairs)
وسوف تفعل أيضا.
أوصي:
sum(i for i, _ in list_of_pairs)
ملحوظة:
باستخدام المتغير _
(أو __
لتجنب التعارض مع الاسم المستعار gettext
) بدلاً من j
له فائدتان على الأقل:
_
(الذي يرمز إلى العنصر النائب) يتمتع بسهولة قراءة أفضلpylint
لن يشكو:"المتغير غير المستخدم 'j'"
إذا كان لديك قائمة كبيرة جدا أو المولدات التي تنتج عددا كبيرا من الأزواج قد ترغب في استخدام النهج القائم على المولد. للمتعة يمكنني استخدام itemgetter()
وimap()
أيضا. نهج قائم على مولد بسيط قد يكون كافيا، وإن كان.
import operator
import itertools
idx0 = operator.itemgetter(0)
list_of_pairs = [(0, 1), (2, 3), (5, 7), (2, 1)]
sum(itertools.imap(idx0, list_of_pairs))
لاحظ أن itertools.imap()
متاح في بيثون> = 2.3. بحيث يمكنك استخدام النهج القائم على مولد هناك، أيضا.
وغامض (ولكن متعة) الجواب:
>>> sum(zip(*list_of_pairs)[0])
9
وأو عندما والرمز البريدي وiterables فقط هذا يجب أن تعمل:
>>> sum(zip(*list_of_pairs).__next__())
9
وفيما يلي نموذج التعليمات البرمجية، يمكنك أيضا تحديد نطاق القائمة.
def test_lst_sum():
lst = [1, 3, 5]
print sum(lst) # 9
print sum(lst[1:]) # 8
print sum(lst[5:]) # 0 out of range so return 0
print sum(lst[5:-1]) # 0
print sum(lst[1: -1]) # 3
lst_tp = [('33', 1), ('88', 2), ('22', 3), ('44', 4)]
print sum(x[1] for x in lst_tp[1:]) # 9
إذا كنت لا تمانع في تحويله إلى مجموعة نمباي، يمكنك استخدام np.sum
على axis=0
على النحو الوارد <لأ href = "https://docs.scipy.org/doc/numpy/reference/generated/numpy.sum هتمل "يختلط =" نوفولو noreferrer "> هنا