2

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

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

结果:

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

我如何在一条线上计算我在优惠券上的中奖号码?我想要返回统计信息,例如这样:

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

在哪里

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

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

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

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

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

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

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

4

6 回答 6

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})
于 2012-11-06T22:21:04.030 回答
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)]
于 2012-11-06T22:22:49.047 回答
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直接使用实例。

于 2012-11-06T22:20:56.087 回答
0

首先编写一个函数,返回适当的盒子,给定一张乐透彩票和中奖号码,即你的例子

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

将返回 2。

然后,编写一个遍历整个票证数组的函数,根据第一个函数的返回值递增适当的数组索引。

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

于 2012-11-06T22:14:05.720 回答
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))
于 2012-11-06T22:21:42.187 回答
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 个中奖号码,即使它们与 in 的位置不同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
于 2012-11-06T22:27:45.233 回答