我有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个中奖号码的优惠券数量
答案 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