كيف يمكنني جمع القيمة الأولى في كل صف في قائمة الصفوف في بايثون؟

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

  •  10-07-2019
  •  | 
  •  

سؤال

لدي قائمة من الصفوف (الأزواج دائمًا) مثل هذا:

[(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 له فائدتان على الأقل:

  1. _(الذي يرمز إلى العنصر النائب) يتمتع بسهولة قراءة أفضل
  2. 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 "> هنا

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