我正在尝试生成两个数组a
和b
,每个数组包含〜1000个随机数。随机数介于1和5之间。
我希望然后将a
中的每个元素与b
的相应元素进行比较,以便a[i] > b[i]
变量counter
将增加1。被视为成功&#34;。否则,如果a[i] <= b[i]
没有任何反应(即counter += 0
)。这被视为&#34;失败&#34;。
但是,a
和b
的长度可以变化,因此len(a) == len(b)
和len(a) != len(b)
都是可能的。
对于后者,如果len(a) > len(b)
我喜欢所有&#34;额外&#34; a
的元素自动计为&#34;成功&#34;。如果len(b) > len(a)
事情应该正常进行(即&{34; b
的额外&#34;元素将被忽略)。
例如:
如果a = [1, 3, 4, 2]
和b = [2, 4, 0]
然后counter = 2
因为(1 < 2
,3 < 4
,4 > 0
和2
是额外的,并且是自动成功的。)
我该怎么做呢?
以下是一些快速代码,它会返回预期的list index out of range...
错误:
import random
a = []
b = []
counter = 0
for i in range(1000):
a += [random.randint(1, 5)]
for i in range(900):
b += [random.randint(1, 5)]
for i in range(len(a)):
if a[i] > b[i]:
counter += 1
print counter
答案 0 :(得分:2)
只需检查一下你的循环中是否有b
的结尾:
for i in range(len(a)):
if (i >= len(b)) or a[i] > b[i]:
counter += 1
你也可以更聪明,做一些事情:
for i in range(min(len(a), len(b)):
if a[i] > b[i]:
counter += 1
if len(a) > len(b):
counter += (len(a) - len(b))
(在这里使用xrange
也是一个小改进。)
答案 1 :(得分:2)
这样做的一种方法是:
len([_ for (i, j) in zip(a, b) if i > j]) + max(len(a) - len(b), 0)
答案 2 :(得分:1)
使用来自itertools的izip_longest。这适用于两个长度不相等的列表。
In [47]: 2>None
Out[47]: True
因为你需要检查最好的效果。
In [35]: from itertools import izip_longest
In [37]: lst=list(izip_longest(a,b))
In [38]: lst
Out[38]: [(1, 2), (3, 4), (4, 0), (2, None)]
In [42]: mylst=[(i>j) for (i,j) in lst]
In [44]: c=Counter(mylst)
In [45]: c[True]
Out[45]: 2
答案 3 :(得分:1)
使用itertools.izip_longest
import random
import itertools
l1 = [random.randint(1,20) for x in range(20)]
l2 = [random.randint(1,20) for x in range(25)]
sum([1 if y < x else 0 for (x,y) in itertools.izip_longest(l1, l2, fillvalue=random.randint(1,20)])
如果列表的长度不相同,izip_longest
将再次生成随机数以填充剩余值(但在重新阅读您的问题后 - 似乎更正确的方式是fillvalue=-1
)。基本上你可以使用那里的任何数值(或任何可以与int比较的东西,如果列表是整数类型)。
答案 4 :(得分:0)
使用itertools.izip_longest
https://docs.python.org/2/library/itertools.html#itertools.izip_longest,计算a大于b的情况的数量,并使用小于最低a的b的填充值。这将导致最简单的控制流程和最清晰的代码。拍摄,你可以强制使用总和强制bool:sum(a > b for a, b in itertools.izip_longest(a_list, b_list, fillvalue=-1))
。
答案 5 :(得分:0)
我认为您只需添加一个条件来检查我的值是否小于列表B大小
for i in range(len(a)):
if i < len(b) and a[i] > b[i]:
counter += 1
答案 6 :(得分:-1)
您可以像这样迭代对:
for x, y in zip(a,b):
# if x > y...
其余部分可以通过检查长度来解决:
counter += len(a) - len(b) if len(a) > len(b) else 0