在一行中起作用以计算彩票中的获胜优惠券

时间:2012-11-06 22:10:44

标签: python list statistics counter

我有Lotto(彩票)的优惠券:

coupons = [[1,4,7,34,45,67], [2,8,16,34,35,38] ... ]

和结果:

result = [7,12,13,26,29,34]

如何在优惠券 IN ONE LINE 中计算我的获奖者? 我想返回统计数据,例如:

statistics = [20, 15, 11, 1, 0, 0, 0]

,其中

statistics [0] - 有0个中奖号码的优惠券数量,

统计数据[1] - 有1个中奖号码的优惠券数量,

统计数据[2] - 有2个中奖号码的优惠券数量,

统计数据[3] - 有3个中奖号码的优惠券数量,

统计数据[4] - 有4个中奖号码的优惠券数量,

统计数据[5] - 有5个中奖号码的优惠券数量,

统计数据[6] - 有6个中奖号码的优惠券数量

6 个答案:

答案 0 :(得分:2)

如果您不将导入计为“一行”,那么这会在一行中产生结果:

>>> coupons = [[1,4,7,34,45,67], [2,8,16,34,35,38], [1,4,7,13,55],
               [7,12,13,26,29,19]]
>>> result = [7,12,13,26,29,34]
>>>
>>> import collections
>>> collections.Counter(len(set(c).intersection(set(result))) for c in coupons)
Counter({2: 2, 1: 1, 5: 1})

答案 1 :(得分:2)

试试这个:

from collections import Counter

coupons = [[1,4,7,34,45,67]  , [2,8,16,34,35,38],
           [7,12,13,26,29,34], [1,2,3,4,5,6]]
result  = [7,12,13,26,29,34]

answer = Counter([6-len(set(result)-set(s)) for s in coupons])

最后一行是请求的单行。请注意,我必须更改内部使用的数据结构才能工作 - 优惠券和结果现在都以表示,结果存储在Counter中(一种特殊的字典),但所有实际用途的答案都表现为数组:

answer[0]
> 1

...

answer[6]
> 1

<强>更新

好的,我设法将转换压缩到一行中的实际列表。这是有效(你最好使用我上面的第一个解决方案),但是,它可以工作,它只是一行:

[Counter([6-len(set(result)-set(s)) for s in coupons])[x] for x in xrange(7)]

答案 2 :(得分:1)

以下将完成这项工作:

from collections import *
cnt = defaultdict(int, Counter(len(set(result) & set(c)) for c in coupons))
statistics = [cnt[n] for n in range(7)]

通过用分号分隔三个语句,可以简单地将它组合成一个单行,虽然我没有看到除了使代码更难阅读之外还能实现什么。

如果statistics不必是列表,您可以将调用放到defaultdict()以及最后一行,并直接使用Counter实例。

答案 3 :(得分:0)

首先编写一个函数,返回相应的框,给出一个乐透彩票和中奖号码,即你的例子

ticket = [1,4,7,34,45,67]
result = [7,12,13,26,29,34]

将返回2.

然后,编写一个迭代整个票证数组的函数,根据第一个函数的返回值递增相应的数组索引。

编辑:哦,一行代码,或一行数组?

答案 4 :(得分:0)

如果你使用numpy很容易(但有点难看):

coupon=np.random.randint(0,100,(50,6)) % 50 coupons with 6 numbers between 0-99
statistics=np.random.randint(0,100,(6,))

np.histogram(np.sum((coupon==statistics[0]) | (coupon==statistics[1]) | (coupon==statistics[2]) | (coupon==statistics[3]) | (coupon==statistics[4]) | (coupon==statistics[5]),1),bins=np.arange(0,7))

答案 5 :(得分:0)

coupons = [[1,4,7,34,45,67], [2,8,16,34,35,38] … ]
result = [7,12,13,26,29,34]

如果coupons / result中的数字位置无关紧要(coupon有4个中奖号码,即使它们位于与result不同的位置),那么这将起作用(如果没有重复的数字,你可以更好地工作,你不必匹配这些重复数字的出现频率):

result = set(result)
statistics = [len([coupon for coupon in coupons if len(set(coupon).intersection(result))==i]) for i in range(len(result))]

然而,这是非常低效的(O(n ^ 2))。我会建议基于字典的方法和排序:

def getStats:
    result = set(result)
    statistics = [0]*len(result)
    for coupon in coupons:
        statistics[len(set(coupon).intersection(result))] += 1
    return statistics