如果我有两个列表一个名为"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()
来确定i
和i+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 = 1
,False = 0
),可以短几个字符,如特雷泽维尔的答案
[sum(lower < e < upper for e in match) for lower, upper in zip(base, base[1:])]
较旧的 Python 版本可能需要额外的大括号才能将 sum 的 arg 识别为生成器