Какой самый быстрый способ сравнить каждый элемент списка с соответствующим элементом другого списка? - PullRequest
0 голосов
/ 08 октября 2018

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

list1 = [4,1,3]
list2 = [2,5,2]

Так что сравнивайте 4 с 2, 1 с5, 3 с 2.

Существуют ли другие быстрые способы сделать это, кроме использования цикла for?

Ответы [ 7 ]

0 голосов
/ 08 октября 2018

Просто для лучшего сравнения, если все подходы рассчитаны одинаково:

paul_numpy:  0.15166378399999303
artner_LCzip:  0.9575707100000272
bhlsing_map__int__:  1.3945185019999826
rahul_maplambda:  1.4970900099999653
rahul_LCzip:  0.9604789950000168

Код, используемый для синхронизации:

setup_str = '''import numpy as np
list1 = list(map(int, np.random.randint(0, 100, 1000000)))
list2 = list(map(int, np.random.randint(0, 100, 1000000)))'''


paul_numpy = 'list1 = np.array(list1); list2 = np.array(list2);list1 < list2'
t = timeit.Timer(paul_numpy, setup_str)
print('paul_numpy: ', min(t.repeat(number=10)))

artner = '[a > b for a,b in zip(list1,list2)]'
t = timeit.Timer(artner, setup_str)
print('artner_LCzip: ', min(t.repeat(number=10)))

blhsing = 'list(map(int.__lt__, list1, list2))'
t = timeit.Timer(blhsing, setup_str)
print('bhlsing_map__int__: ', min(t.repeat(number=10)))

rahul_lambda = 'list(map(lambda x,y:x<y,list1,list2))'
t = timeit.Timer(rahul_lambda, setup_str)
print('rahul_maplambda: ', min(t.repeat(number=10)))

rahul_zipfor = '[i<j for i,j in zip(list1,list2)]'
t = timeit.Timer(rahul_zipfor, setup_str)
print('rahul_LCzip: ', min(t.repeat(number=10)))
0 голосов
/ 08 октября 2018

Использование перечисление устраняет необходимость в любых zip или map здесь

[item > list2[idx] for idx, item in enumerate(list1)]
# [True, False, True]
0 голосов
/ 08 октября 2018

на самом деле, я должен сказать, что нет более быстрого способа выполнить желаемое действие, кроме этого цикла, потому что если вы посмотрите ближе к проблеме, вы увидите, что с помощью алгоритма это действие требует по крайней мере O(n).поэтому все ответы верны и будут делать, как вы хотите, с Zip или map или ... но эти решения просто делают вашу реализацию более красивой и питонной.не быстрее, в некоторых случаях, например, blhsing answer, это немного быстрее из-за меньшего количества строк кода, а не из-за сложности времени.

0 голосов
/ 08 октября 2018

Вы можете сопоставить два списка с оператором, таким как int.__lt__ (оператор "меньше чем"):

list(map(int.__lt__, list1, list2))

При вводе пробы возвращается:

[False, True, False]
0 голосов
/ 08 октября 2018

Вы можете сделать это следующим образом,

Использование лямбды:

In [91]: map(lambda x,y:x<y,list1,list2)
Out[91]: [False, True, False]

С zip и для цикла:

In [83]: [i<j for i,j in zip(list1,list2)]
Out[83]: [False, True, False]

Время выполнения для лямбды идля цикла:

In [101]: def test_lambda():
     ...:     map(lambda x,y:x>y,list1,list2)
     ...:     

In [102]: def test_forloop():
     ...:     [i<j for i,j in zip(list1,list2)]
     ...:     

In [103]: %timeit test_lambda
     ...: 
10000000 loops, best of 3: 21.9 ns per loop

In [104]: %timeit test_forloop
10000000 loops, best of 3: 21 ns per loop
0 голосов
/ 08 октября 2018

Вы можете использовать zip() до , чтобы объединить элементы списка и понимание списка для создания результирующего списка:

list1 = [4,1,3]
list2 = [2,5,2]

list1_greater_list2_value = [a > b for a,b in zip(list1,list2)]

print ("list1-value greater then list2-value:", list1_greater_list2_value) 

Вывод:

 list1-value greater then list2-value: [True, False, True]

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

0 голосов
/ 08 октября 2018

Для этого вы можете использовать библиотеку numpy.И это значительно быстрее

>>> import numpy as np
>>> list1 = np.array([4,1,3]) 
>>> list2 = np.array([2,5,2])
>>> list1 < list2
array([False,  True, False])

Время, необходимое для запуска функции

>>> import timeit
>>> timeit.timeit("""
... import numpy as np
... list1 = np.array([4,1,3])
... list2 = np.array([2,5,2])
... print(list1 < list2)
... """,number=1)
[False  True False]
0.00011205673217773438

Ну, тот факт, что numpy в основном написан на C, C ++ делает его значительно быстрее, если вы посмотрите нареализация этого.

...