如何比较两个列表并计算另一个列表的对象之间的一个列表的数量



如果我有两个列表一个名为"base",用于分解另一个列表另一个是"匹配"像下面一样

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

我想计算"base"的两个对象中有多少个"匹配",并存储在另一个称为"结果"的列表中所以"结果"应该是 [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

对于我的例子/基数 = [4,7,13,14,19]/匹配 = [1,2,5,9,10,12,15,18]我的代码结果为 [2,0,2,0]因为 5 大于 4,所以它继续比较 9 到 7,跳过比较 5 到 7 的过程

使用 sum() 来确定ii+1 base元素之间的match元素数。

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]

可以有更好的方法。但是 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]

这个怎么样?

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]
我认为

单行列表理解比问题描述更容易理解:

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 = 1False = 0),可以短几个字符,如特雷泽维尔的答案

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

较旧的 Python 版本可能需要额外的大括号才能将 sum 的 arg 识别为生成器

相关内容

  • 没有找到相关文章