Сравнение двух списков с больше чем> или меньше чем < - PullRequest
2 голосов
/ 04 января 2012

У меня есть два списка, которые я пытаюсь сравнить с <или> в python.

Один (список1) - это наклон, а затем горизонтальная линия (нарисуйте тупой угол около 130 градусов), второйлинейная функция с отрицательным наклоном, которую я вычислил из первого списка (list2).Я хотел бы сравнить два списка list1 и list2 и создать новый list3, где list3 = все точки в list1> list2.У меня проблемы с определением, как к этому подойти.Я пытался понять список, но получаю ошибку

ValueError: Значение истинности массива с более чем одним элементом неоднозначно.

v = [c for c in f if c > y]
list1= [0.0, 0.36, 0.34, 0.32, 0.32, 0.3, 0.3, 0.28, 0.28, 0.26, 0.26, 0.24, 0.24, 0.22, 0.22, 0.2, 0.2, 0.18, 0.18, 0.16, 0.16, 0.14, 0.14, 0.12, 0.12, 0.1, 0.1, 0.08, 0.08, 0.06, 0.06, 0.04, 0.04, 0.02, 0.02, 0.0,..., 0.0]
list2= [ 0.36  0.35  0.34 ..., -9.62 -9.63 -9.64]

Любая помощь, совет или руководство будет принята с благодарностью.Также, пожалуйста, дайте мне знать, если мой вопрос в любом случае неясен.

Ответы [ 7 ]

5 голосов
/ 04 января 2012

Если вы имеете в виду, что list3 - это набор значений из list1, где соответствующее значение в list2 меньше, то:

list3 = [item1 for item1, item2 in zip(list1, list2) if item1 > item2]
2 голосов
/ 04 января 2012

Вы говорите «список», но из сообщения об ошибке и выходных данных я подозреваю, что вы работаете с пустыми массивами.В любом случае проблема с v = [c for c in f if c > y] состоит в том, что вы сравниваете элемент c с массивом y.Вы хотите сравнить элемент с элементом.

В случае со списком вы можете сделать следующее:

>>> aa = [2,3,4,5]
>>> bb = [3,4,2,5]
>>> 
>>> z = [a for a,b in zip(aa,bb) if a > b]
>>> z
[4]

Или, если вы действительно работаете с массивами, вы можетеэто еще проще:

>>> import numpy
>>> aa = numpy.array([2,3,4,5])
>>> bb = numpy.array([3,4,2,5])
>>> aa > bb
array([False, False,  True, False], dtype=bool)
>>> aa[aa > bb]
array([4])
1 голос
/ 04 января 2012
[elmt1 for elmt1, elmt2 in zip(list1, list2) if elmt1 > elmt2]

По сути, это напрямую отражает вопрос: выберите элементы из списка1, которые больше соответствующего элемента в списке 2.

Если один из списков длиннее, его дополнительные элементы нельзя сравнить с элементами издругой список, и они игнорируются.

0 голосов
/ 04 января 2012

Для тех из вас, кто хочет использовать ленивый итератор:

from itertools import izip, ifilter
i = ifilter(lambda (x,y): x > y, izip(list1, list2))
list3 = list(i)

Это будет завершено, когда в любом списке закончатся значения. Чтобы перебрать самый длинный список, используйте izip_longest:

from itertools import izip_longest, ifilter
i = ifilter(lambda (x,y): x > y, izip_longest(list1, list2, fillvalue=0))
list3 = list(i)

И поскольку здесь используются итераторы, вы можете заменить бит list3 = list(i) на цикл, чтобы фактически использовать значения при их генерировании, если это необходимо.

0 голосов
/ 04 января 2012

Если я правильно понимаю, что ваш вопрос означает список точек (x, y), в которых list1 [i]> list2 [i], а не просто список значений из list1, это

list3 = [(i,val) for i, val in enumerate(list1) if val > list2[i]]

вернет этот список в виде точек.Если вам нужно узнать, по какому индексу list1> list2, тогда полезно enumerate.

Если все, что вас интересует, это список индексов, при которых два массива равны: все x, для которых f (x)> g (x) другими словами, тогда все, что вам нужно, это индексы:

list3 = [i for i, val in enumerate(list1) if val > list2[i]]
0 голосов
/ 04 января 2012

с использованием izip_longest http://docs.python.org/library/itertools.html#itertools.izip_longest

list3 = [i for i,j in itertools.izip_longest(list1, list2, 0) if i > j]
0 голосов
/ 04 января 2012

при условии, что оба списка имеют одинаковый размер,

list3 = [list1[i] for i in range(len(list1)) if list1[i]>list2[i]]
...