Найти место в списке по значению в Python? - PullRequest
3 голосов
/ 19 марта 2012

Я новичок в Python, и я смотрю на некоторые новые формы кода. Я выбрал 5 случайных чисел от одного до двадцати, здесь, в двух списках. Вот так.

list = []
listn = []
import random
for i in range(5):
     newvar = random.randomint(1,20)
     list.append(newvar)
     newvart = random.randomint(1,20)
     listn.append(newvart)

Затем я выбираю другую переменную в том же коде.

evar = random.randomint(1,20)

То, что я хочу сделать, это посмотреть, есть ли номер в обоих списках, и если да, если они находятся в одной и той же позиции в списке. Я должен начать это, выполнив следующее:

if (evar in list) and (evar in listn):

Но я не знаю, как сделать все остальное. Я хочу выяснить, находится ли evar в обоих списках и находится ли он в одном и том же месте в обоих списках (то есть это третье число в списке и списке). Как бы я это сделал?

Ответы [ 5 ]

3 голосов
/ 19 марта 2012

Предполагая, что первые найденные позиции должны быть одинаковыми при использовании list.index() метода :

def f(lst1, lst2, value):
    try: return lst1.index(value) == lst2.index(value)
    except ValueError:
        return False

Разрешение всех позиций с использованием set intersection :

def positions(lst, value):
    return (pos for pos, x in enumerate(lst) if x == value)

def f(lst1, lst2, value):
    return bool(set(positions(lst1, value)).intersection(positions(lst2, value)))

Или даже лучше: решение на основе zip(), предложенное @ wim :

from itertools import izip

def f(lst1, lst2, value):
    return any(x1 == x2 == value for x1, x2 in izip(lst1, lst2))

Примечание: any() возвращается, как толькоон находит первый элемент True без нумерации остальных элементов.

2 голосов
/ 19 марта 2012

Редактировать: Это та же самая базовая идея в однострочнике, что и JF в комментариях ниже:

any(x1 == x2 == evar for x1, x2 in zip(list1, list2))


>>> def foo(list1, list2, evar):
...   for x1, x2 in zip(list1, list2):
...     if x1 == x2 == evar:
...       return True
...   else:
...     return False
... 
>>> foo([1, 2, 69, 3], [3, 4, 69, 5], 69)
True
>>> foo([1, 2, 69, 3], [3, 4, 69, 5], 3)
False
>>> foo([1, 2, 2, 3], [3, 4, 2, 5], 2)
True

Вот несколько дополнительных советов:

  • Следует избегать использования list в качестве имени переменной, поскольку оно затеняет встроенное.
  • Нет random.randomint, я думаю, вы имели в виду random.randint
  • Генерация случайных списков может быть осуществлена ​​с помощью понимания списка, а не цикла, например: [random.randint(1, 20) for _ in xrange(5)]
1 голос
/ 19 марта 2012

Если вам нужно знать индекс, где происходит совпадение, вы можете использовать что-то вроде этого

try:
    idx = next(i for i,x in enumerate(list1) if evar==x==list2[i])
    ...
except StopIteration:
    # not found
    ...

или более просто, используя предложение Дж. Ф. Себастьяна

idx = next((i for i,x in enumerate(list1) if evar==x==list2[i]), -1)

вернет -1 если нет совпадений

0 голосов
/ 19 марта 2012

Python действительно прост в этих отношениях, он чрезвычайно прост в обращении. Просто используйте list.index (var), который возвращает индекс, полученный var в списке.

from random import randint 
list1 = []
list2 = []
for i in range(5):
    list1.append(randint(1,20))
    list2.append(randint(1,20))
evan = randint(1,20) 
if (evan in list1 and evan in list 2) and (list1.index(evan) == list2.index(evan)):
    print 'They are at the same place'.
0 голосов
/ 19 марта 2012
if (evar in list):
    if (evar2 in listn):
        if (evar == evar2 and list.index(evar2) == listn.index(evar2):
            do_something()
...