باستخدام طريقة فهرس قائمة Python () في قائمة TUPLES أو الكائنات؟

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

سؤال

يحتوي نوع قائمة Python على مؤشر () أسلوب يأخذ معلمة واحدة وإرجاع فهرس العنصر الأول في القائمة المطابقة للمعلمة. على سبيل المثال:

>>> some_list = ["apple", "pear", "banana", "grape"]
>>> some_list.index("pear")
1
>>> some_list.index("grape")
3

هل هناك طريقة رشيقة (اصطلاحية) لتوسيع ذلك إلى قوائم الكائنات المعقدة، مثل tuples؟ من الناحية المثالية، أود أن أكون قادرا على فعل شيء مثل هذا:

>>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]
>>> some_list.getIndexOfTuple(1, 7)
1
>>> some_list.getIndexOfTuple(0, "kumquat")
2

Getindexoftuple () هي مجرد طريقة افتراضية تقبل فهرس فرعي وقيمة، ثم إرجاع فهرس عنصر القائمة بالقيمة المحددة في هذا الفهرس الفرعي. أأمل

هل هناك طريقة لتحقيق هذه النتيجة العامة، باستخدام قائمة الفهم أو Lambas أو شيء ما "في خط" هكذا؟ أعتقد أنني أستطيع أن أكتب صفي وطريقة خاصة بي، لكنني لا أريد إعادة اختراع العجلة إذا كان بيثون لديه بالفعل وسيلة للقيام بذلك.

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

المحلول

وماذا عن هذا؟

>>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]
>>> [x for x, y in enumerate(tuple_list) if y[1] == 7]
[1]
>>> [x for x, y in enumerate(tuple_list) if y[0] == 'kumquat']
[2]

كما أشار في التعليقات، فإن هذا سيحصل على جميع المباريات. للحصول على أول واحد، يمكنك القيام به:

>>> [y[0] for y in tuple_list].index('kumquat')
2

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

نصائح أخرى

هذه القائمة الفهم فوضوي بعد فترة من الوقت.

أنا أحب هذا النهج بيثوني:

from operator import itemgetter

def collect(l, index):
   return map(itemgetter(index), l)

# And now you can write this:
collect(tuple_list,0).index("cherry")   # = 1
collect(tuple_list,1).index("3")        # = 2

إذا كنت بحاجة إلى رمزك ليكون كل أداء سوبر:

# Stops iterating through the list as soon as it finds the value
def getIndexOfTuple(l, index, value):
    for pos,t in enumerate(l):
        if t[index] == value:
            return pos

    # Matches behavior of list.index
    raise ValueError("list.index(x): x not in list")

getIndexOfTuple(tuple_list, 0, "cherry")   # = 1

احتمال واحد هو استخدام عينات وظيفة من operator وحدة:

import operator

f = operator.itemgetter(0)
print map(f, tuple_list).index("cherry") # yields 1

دعوة إلى itemgetter إرجاع وظيفة سوف تفعل ما يعادل foo[0] لأي شيء مرت إليه. استخدام map, ثم قم بتطبيق هذه الوظيفة على كل Tuple، واستخراج المعلومات في قائمة جديدة، والتي تقوم عليها بعد ذلك index كالطبيعي.

map(f, tuple_list)

أي ما يعادل:

[f(tuple_list[0]), f(tuple_list[1]), ...etc]

والتي بدورها تعادل:

[tuple_list[0][0], tuple_list[1][0], tuple_list[2][0]]

الذي يعطي:

["pineapple", "cherry", ...etc]

يمكنك القيام بذلك مع الفهم القائمة والفهرس ()

tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]
[x[0] for x in tuple_list].index("kumquat")
2
[x[1] for x in tuple_list].index(7)
1

أود أن أضع هذا كتعليق على triptych، لكنني لا أستطيع التعليق حتى الآن بسبب نقص التقييم:

باستخدام طريقة العداد للمطابقة على المؤشرات الفرعية في قائمة tuples. على سبيل المثال

li = [(1,2,3,4), (11,22,33,44), (111,222,333,444), ('a','b','c','d'),
        ('aa','bb','cc','dd'), ('aaa','bbb','ccc','ddd')]

# want pos of item having [22,44] in positions 1 and 3:

def getIndexOfTupleWithIndices(li, indices, vals):

    # if index is a tuple of subindices to match against:
    for pos,k in enumerate(li):
        match = True
        for i in indices:
            if k[i] != vals[i]:
                match = False
                break;
        if (match):
            return pos

    # Matches behavior of list.index
    raise ValueError("list.index(x): x not in list")

idx = [1,3]
vals = [22,44]
print getIndexOfTupleWithIndices(li,idx,vals)    # = 1
idx = [0,1]
vals = ['a','b']
print getIndexOfTupleWithIndices(li,idx,vals)    # = 3
idx = [2,1]
vals = ['cc','bb']
print getIndexOfTupleWithIndices(li,idx,vals)    # = 4

مستوحاة من هذا السؤال, ، لقد وجدت أن هذا أنيق للغاية:

>>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]
>>> next(i for i, t in enumerate(tuple_list) if t[1] == 7)
1
>>> next(i for i, t in enumerate(tuple_list) if t[0] == "kumquat")
2

حسنا، قد يكون خطأ في vals(j), ، التصحيح هو:

def getIndex(li,indices,vals):
for pos,k in enumerate(lista):
    match = True
    for i in indices:
        if k[i] != vals[indices.index(i)]:
            match = False
            break
    if(match):
        return pos
tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]

def eachtuple(tupple, pos1, val):
    for e in tupple:
        if e == val:
            return True

for e in tuple_list:
    if eachtuple(e, 1, 7) is True:
        print tuple_list.index(e)

for e in tuple_list:
    if eachtuple(e, 0, "kumquat") is True:
        print tuple_list.index(e)
z = list(zip(*tuple_list))
z[1][z[0].index('persimon')]

لا يوجد أي شخص يقترح لامدراس؟

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

    l #[['rana', 1, 1], ['pato', 1, 1], ['perro', 1, 1]]

    map(lambda x:x[0], l).index("pato") #1 

تحرير لإضافة أمثلة:

   l=[['rana', 1, 1], ['pato', 2, 1], ['perro', 1, 1], ['pato', 2, 2], ['pato', 2, 2]]

استخراج جميع البنود حسب الحالة: عامل تصفية (Lambda x: x [0] == "Pato"، L) # [['pato'، 2، 1]، ['pato'، 2، 2]، ['pato'، 2، 2]

استخراج جميع البنود حسب الشرط مع الفهرس:

    >>> filter(lambda x:x[1][0]=="pato", enumerate(l))
    [(1, ['pato', 2, 1]), (3, ['pato', 2, 2]), (4, ['pato', 2, 2])]
    >>> map(lambda x:x[1],_)
    [['pato', 2, 1], ['pato', 2, 2], ['pato', 2, 2]]

ملاحظة: _ المتغير يعمل فقط في مترجم تفاعلي Y Normal Text File _ تحتاج إلى تخصيص Explicti، أي _ = عامل تصفية (Lambda X: x [1] [0] == "Pato"، تعداد (L))

قائمة Python's List.Index (X) إرجاع فهرس الحدوث الأول ل X في القائمة. لذلك يمكننا تمرير الكائنات التي تم إرجاعها بواسطة ضغط القائمة للحصول على فهرسهم.

>>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11)]
>>> [tuple_list.index(t) for t in tuple_list if t[1] == 7]
[1]
>>> [tuple_list.index(t) for t in tuple_list if t[0] == 'kumquat']
[2]

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

>>> tuple_list = [("pineapple", 5), ("cherry", 7), ("kumquat", 3), ("plum", 11), ("banana", 7)]
>>> [tuple_list.index(t) for t in tuple_list if t[1] == 7]
[1, 4]

أعتقد أن ما يلي ليس أفضل طريقة للقيام بذلك (مخاوف السرعة والأناقة) ولكن جيدا، يمكن أن يساعد:

from collections import OrderedDict as od
t = [('pineapple', 5), ('cherry', 7), ('kumquat', 3), ('plum', 11)]
list(od(t).keys()).index('kumquat')
2
list(od(t).values()).index(7)
7
# bonus :
od(t)['kumquat']
3

يمكن تحويل Tuespes with 2 أعضاء إلى DICT الممردة مباشرة، وهياكل البيانات هي في الواقع هي نفسها، حتى نتمكن من استخدام طريقة DICT على الطاير.

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