如果我有两个清单 一个名为" 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)`
然而,存在一个问题,如果匹配对象大于基础对象,则当前匹配对象将被视为其他对象并继续比较下一个匹配&#39; s反对下一个基地的对象。结果,当前基础对象被跳过
我的例子/ 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的过程
答案 0 :(得分: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]
答案 1 :(得分: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]
答案 2 :(得分:0)
这个怎么样?
None
答案 3 :(得分: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]
如果你对bool(True = 1
,False = 0
的总和没有问题,那么可以缩短几个字符,就像Trelzevir的回答一样
[sum(lower < e < upper for e in match) for lower, upper in zip(base, base[1:])]
较旧的python版本可能需要额外的大括号才能将sum的arg识别为生成器