Python比较两个不均匀的数组

时间:2015-05-25 16:44:39

标签: python arrays

我正在尝试生成两个数组ab,每个数组包含〜1000个随机数。随机数介于1和5之间。

我希望然后将a中的每个元素与b的相应元素进行比较,以便a[i] > b[i]变量counter将增加1。被视为成功&#34;。否则,如果a[i] <= b[i]没有任何反应(即counter += 0)。这被视为&#34;失败&#34;。

但是,ab的长度可以变化,因此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 < 23 < 44 > 02是额外的,并且是自动成功的。)

我该怎么做呢?

以下是一些快速代码,它会返回预期的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

7 个答案:

答案 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

的简单oneliner
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