Как проверить индекс элемента в списке? (Python) - PullRequest
2 голосов
/ 29 ноября 2009
list = [('ba',4), ('hh',5), ('gg', 25)]

Как мне сделать:

list.index ('hh') ... и возвращает 1?

Тогда, как мне отсортировать по 25, 5, 4?

Что если у меня есть 2 списка:

list1 = [('ba',4), ('hh',5), ('gg', 25)]
list2 = [('ja',40), ('hgh',88), ('hh', 2)]

как мне сделать для каждого?

for item in l1:
    if item[0] in l2[0 of the tuple]:  

Ответы [ 8 ]

5 голосов
/ 29 ноября 2009

Прежде всего, не используйте list в качестве имени для переменной, так как она затеняет встроенную функцию list.

  1. Вы можете использовать enumerate для объединения элементов списка и их индекса:

    >>> l = [('ba',4), ('hh',5), ('gg', 25)]
    >>> [i for i, e in enumerate(l) if e[0] == 'hh']
    [1]
    
  2. Для сортировки вы можете использовать выражение lambda, как показано другими, или вы можете передать operator.itemgetter в качестве аргумента key в sorted:

    >>> from operator import itemgetter
    >>> sorted(l, key=itemgetter(1))
    [('ba', 4), ('hh', 5), ('gg', 25)]
    
  3. Также возможна сортировка на месте с использованием метода sort в списках:

    >>> l.sort(key=itemgetter(1))
    
3 голосов
/ 29 ноября 2009

Для нахождения

>>> L = [('ba',4), ('hh',5), ('gg', 25)]
>>> [ i for i,l in enumerate(L) if l[0] == 'hh' ][0]
1

Вам нужно решить, что делать, если он найден несколько раз или не обнаружен вообще - вышеприведенное выдает IndexError, если он не найден, и возвращает первое, если он найден несколько раз.

Для сортировки

>>> L = [('ba',4), ('hh',5), ('gg', 25)]
>>> sorted(L, key=lambda x: x[1])
[('ba', 4), ('hh', 5), ('gg', 25)]
2 голосов
/ 29 ноября 2009

Я думаю, что сортировка ответа Ника хороша, но его метод find излишне перебирает весь список, даже после того, как он нашел совпадение. С небольшим изменением можно исправить остановку итерации, как только он найдет первый элемент:

index = (i for i,l in enumerate(l) if l[0] == 'aa').next()

Или в Python 3:

index = next(i for i,l in enumerate(l) if l[0] == 'aa')
1 голос
/ 29 ноября 2009
from itertools import imap

def find(iterable, item, key=None):
    """Find `item` in `iterable`.

    Return index of the found item or ``-1`` if there is none.

    Apply `key` function to items before comparison with
    `item`. ``key=None`` means an identity function.
    """
    it = iter(iterable) if key is None else imap(key, iterable)
    for i, e in enumerate(it):
        if e == item:
            return i
    return -1

Пример:

L = [('ba', 4), ('hh', 5), ('gg', 25)]
print find(L, 'hh', key=lambda x: x[0])

Выход:

1
1 голос
/ 29 ноября 2009

Для сортировки следует использовать itemgetter

>>> import operator
>>> L = [('ba',4), ('hh',5), ('gg', 25)]
>>> sorted(L, key=operator.itemgetter(1))
[('ba', 4), ('hh', 5), ('gg', 25)]
1 голос
/ 29 ноября 2009

Вы также можете иметь свой список в форме словаря

list1 = [('ba',4), ('hh',5), ('gg', 25)]
dict1 = dict(list1)

print dict1['hh']
5

слова быстрее, чем список, если вам нужен такой поиск.

Кстати, переопределение встроенного типа list для переменных не очень хорошая идея list = [('ba',4), ('hh',5), ('gg', 25)].

1 голос
/ 29 ноября 2009

для сортировки списка. Вы можете использовать пользовательский метод сортировки, например:

x = [('ba',4), ('hh',5), ('gg', 25)]

def sortMethod(x,y):
    if x[1] < y[1]:return 1
    elif x[1] > y[1]:return -1
    else: return 0


print x         #unsorted
x.sort(sortMethod)
print x         #sorted
0 голосов
/ 29 ноября 2009

Для последнего вопроса, преобразовать list2 в набор:

>>> list1 = [('ba',4), ('hh',5), ('gg', 25)]
>>> list2 = [('ja',40), ('hgh',88), ('hh', 2)]
>>> 
>>> wanted = set(a for (a,b) in list2)
>>> for x in list1:
...     if x[0] in wanted:
...         print x
... 
('hh', 5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...