python перебирает два списка в кортеже и сравнивает целое число между tem

У меня есть определенный номер...

x = 6

и два списка здесь...

list1 = [1, 5, 10]
list2 = [3, 7, 20]

Я хотел бы найти позицию определенного числа 6, которое находится между 5 и 7 из list1 и list2 соответственно.

Например, 6 находится между «1-м индексом» как list1, так и list2 (на основе 0), что означает, что оба списка должны повторяться и сравнивать числа.

for a,b in zip(list1,list2): 
    if a <= x <=b:

Детали вышеприведенного цикла for подобны этому

[(1,3),(5,7),(10,20)]

и x принадлежит 1-му индексу кортежа [(0),(1),(2)]

Как я могу получить это?


person Karyo    schedule 02.11.2013    source источник


Ответы (1)


Используйте next и enumerate:

>>> x = 6
>>> next((i for i, (a, b) in enumerate(zip(list1, list2)) if a<=x<=b), None)
1

enumerate возвращает как индекс, так и элемент из переданного ему итератора/итератора, а next вернет первый элемент из итератора, иначе None.

>>> list(enumerate(zip(list1, list2)))
[(0, (1, 3)), (1, (5, 7)), (2, (10, 20))]
person Ashwini Chaudhary    schedule 02.11.2013
comment
@Karyo i используется для хранения индекса, возвращаемого из enumerate: i, (a,b) = (0, (1,3)) . Подобные назначения называются распаковка последовательности. - person Ashwini Chaudhary; 02.11.2013
comment
есть ли способ перечислить кортеж в обратном порядке? например [(2, (1, 3)), (1, (5, 7)), (0, (10, 20))] - person Karyo; 02.11.2013
comment
@Karyo Вы можете сделать это, используя: zip(xrange(len(list1)-1, -1, -1), zip(list1, list2)) - person Ashwini Chaudhary; 02.11.2013
comment
Shell возвращает NameError: имя «xrange» не определено. Я использую версию 3.3.2, и диапазонная доза тоже не работает. TypeError: неупорядоченные типы: int() ‹= tuple() - person Karyo; 02.11.2013
comment
@Karyo Вы должны использовать Python3, используйте range. Да, все это идет в zip, чтобы увидеть, как его содержимое передается в list(). - person Ashwini Chaudhary; 02.11.2013
comment
list(zip(range(len(list1)-1, -1, -1), zip(list1, list2))) работает абсолютно нормально, но... Если я сделаю это следующим((i for i, (a, b ) in (zip(range(len(list1)-1, -1, -1)), zip(list1, list2)) if a‹=x‹=b), None) Shell возвращает ошибку значения ValueError: too many значения для распаковки (ожидаемые 2) не могут работать в обратном направлении? - person Karyo; 02.11.2013
comment
@Karyo В next нет ничего плохого, вы поставили скобки не в том месте: next((i for i, (a, b) in zip(range(len(list1)-1, -1, -1), zip(list1, list2)) if a<=x<=b), None) - person Ashwini Chaudhary; 02.11.2013
comment
Ты прав! наконец то я понял. Большое спасибо за это. - person Karyo; 02.11.2013