2017-01-22 74 views
-2

,如果我有两个列表 一个名为“基地”和用于击穿另一个列表 另一个是“匹配” 像下面如何比较两个列表,算另一个列表的对象之间的一个列表的数量

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

我想统计在“base”的两个对象内有多少个“匹配”数字,并存储在另一个名为“result”的列表中 因此,“result”应该是[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)`  

但是,如果匹配的对象比base的对象大,则当前匹配的对象将被视为else,并继续将下一个匹配的对象与下一个基础对象进行比较。因此,当前基地的目标是跳过

对于我的示例/ 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

可以有更好的方法这个。但是,1路可以是这样的:

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(),以确定在basematchi+1之间i元件的元件的数量。

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] 

可如果你是OK的几个字符短在Trelzevir的回答中,bools的总和(True = 1,False = 0

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

旧的python版本可能需要额外的支撑才能将sum的arg识别为生成器