2017-01-22 15 views
-2

, если у меня есть два список один под названием «база» и используется для разбивки другого списка других «соответствуют» , как показано нижекак сравнить два списка и подсчитать количество одного списка между объектом другого списка в

base = [4,7,13,14,19] 
match = [1,2,5,9,10,12,15,18] 

Я хочу подсчитать, сколько чисел «соответствия» находится в двух объектах «базы» и хранить в другом списке, называемом «результат» Таким образом, «результат» должен быть [1,3,0,2]

Я использовал этот способ

fianl_num = [] 
m = 0 
countnum = 0 
for j in match: 
    if j < base[m]: 
     countnum += 1 
    else: 
     m = m+1 
     fianl_num.append(countnum) 
     countnum = 0 
print(fianl_num)`  

Однако есть проблема, если объект совпадения больше, чем объект базы, объект текущего совпадения будет считаться другим и перейти к сравнению объекта следующего совпадения с объектом следующей базы. В результате объектом текущей базы является skip

для моего примера/base = [4,7,13,14,19]/match = [1,2,5,9,10,12,15,18 ] мой код приводит к [2,0,2,0] , потому что 5 больше 4, поэтому он переходит на сравнение с 9 по 7, пропустил процесс по сравнению с 5 по 7

+4

Что вы имеете в виду с * в течение двух объектов 'base' *? –

+1

Не понял, как вы получили 1,3,0,2 в первом случае –

+1

Чтобы быть более конкретным, можете ли вы объяснить, как результат равен [1,3,0,2]? Возможно, вы можете записать это шаг за шагом. –

ответ

0

Там могут быть лучшие способы это. Но один путь может быть таким:

base = [4,7,13,14,19] 
match = [1,2,5,9,10,12,15,18] 
l = [] 
i = 0 
while i < len(base)-1: 
    count = 0 
    for a in match: 
     if base[i] < a < base[i+1]: 
      count += 1 
    l.append(count) 
    i += 1 
print l 

Выход:

[1, 3, 0, 2] 
+0

Кто является downvoting? : D Пожалуйста, будьте щедры, чтобы упомянуть причину также :) – MYGz

0

Как насчет этого?

base = [4,7,13,14,19] 
match = [1,2,5,9,10,12,15,18] 

fianl_num = [] 
m = 0 
len = len(match) 
countnum = 0 
for j in base: 
    while m < len and match[m] < j: 
     m = m+1 
     countnum += 1 
    if j > base[0]: 
     fianl_num.append(countnum) 
    countnum = 0 
print(fianl_num) 

#[1, 3, 0, 2] 
1

Используйте sum(), чтобы определить количество элементов в match между i и i+1 элементами base.

for i in range(len(base)-1): 
    count=sum(base[i]<x<base[i+1]for x in match) 
    l.append(count) 

Выход:

[1,3,0,2] 
0

Я думаю, что одна строка списка понимание легче понять, чем описание проблемы:

base = [4,7,13,14,19] 
match = [1,2,5,9,10,12,15,18] 

[sum(1 for e in match if lower < e < upper) for lower, upper in zip(base, base[1:])] 

Out[7]: [1, 3, 0, 2] 

может быть несколько голец короче, если все в порядке с (True = 1, False = 0), как и в ответе Трежевира

[sum(lower < e < upper for e in match) for lower, upper in zip(base, base[1:])] 

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