<ul>
<li>只有当您有一个键并通过它存储一个值时,字典才有意义。访问键的值并检查键是否是字典的一部分是快速的(<code>O(1)</code>)-迭代<code>dict</code>的所有值与<code>list</code>一样慢-但是创建字典比创建<code>list</code><em>慢,</em>占用更多的计算机内存</李>
<li>使用<code>set</code>操作可以避免使用<code>if's</code>级联-有关示例,请参阅下文</李>
</ul>
<p>使用<code>split()</code>和列表分解<code>*a,b=[1,2,3,4]</code>可以更快地在循环中输入:</p>
<pre><code>for _ in range(int(input("How many tickets do you want to enter? "))):
*nums, power = map(int,
input( ("Input space seperated numbers of your ticket,"
" last one is Powerball: ") ).strip().split())
print(nums, power)
</code></pre>
<p>输出:</p>
<pre><code>How many tickets do you want to enter? 3
Input space seperated numbers of your ticket, last one is Powerball: 1 2 3 4 99
[1, 2, 3, 4] 99
Input space seperated numbers of your ticket, last one is Powerball: 2 3 4 7 199
[2, 3, 4, 7] 199
Input space seperated numbers of your ticket, last one is Powerball: 4 2 4 5 6
[4, 2, 4, 5] 6
</code></pre>
<p>(尽管对于根本不输入NUMEBR或输入的NUMEBR太少/超出范围的用户,可能需要进行更多检查:<a href="https://stackoverflow.com/questions/23294658/asking-the-user-for-input-until-they-give-a-valid-response">Asking the user for input until they give a valid response</a>)</p>
<hr/>
<p>对于乐透比较,可以使用<code>set</code>-操作快速检查带有一组()数字的“彩票”列表中的正确数字</p>
<p>检查彩票列表将是<code>O(n)</code>(其中<code>n</code>==彩票数量)-检查号码是否与中奖号码匹配是快速的:<code>O(1)</code>并避免<code>if ..:</code></p>
<p>您可以这样做(完全随机示例):</p>
<pre><code>import random
def random_nums():
"""Returns a tuple of a frozenset of 5 numbers in the range [1..69]
and one number in the range of [1..26] (aka: USA Powerball Lottery)"""
return ( frozenset(random.sample(range(1,70), 5)), random.choice(range(1,27)) )
# draw the win-numbers
winning_nums = set(random.sample(range(1,70), 5))
powerball = random.choice(range(1,27))
# print them
print("Winner: ", *winning_nums, " Powerball: ", powerball)
# generate random tickets
tickets = [ random_nums() for _ in range(10) ]
# check if ticket got something in common with winner numbers
for (nums, power) in tickets:
# fast set operations
intersect = sorted(nums.intersection(winning_nums))
wrong = sorted(nums.difference(winning_nums))
p = 'correct' if power == powerball else 'wrong'
n = "'nothing'"
# some output
print( ( f"You got {intersect or n} correct and guessed "
f"{wrong or n} wrong. Powerball: {p}.") )
</code></pre>
<p>输出:</p>
<pre><code>Winner: 14 49 26 27 60 Powerball: 6
You got [49] correct and guessed [21, 41, 59, 66] wrong. Powerball: wrong.
You got [60] correct and guessed [17, 19, 63, 68] wrong. Powerball: wrong.
You got 'nothing' correct and guessed [10, 21, 51, 67, 69] wrong. Powerball: wrong.
You got 'nothing' correct and guessed [18, 30, 40, 45, 52] wrong. Powerball: wrong.
You got [26, 27] correct and guessed [11, 37, 58] wrong. Powerball: wrong.
You got 'nothing' correct and guessed [28, 33, 38, 59, 65] wrong. Powerball: wrong.
You got 'nothing' correct and guessed [11, 18, 35, 61, 64] wrong. Powerball: wrong.
You got 'nothing' correct and guessed [2, 3, 47, 54, 63] wrong. Powerball: wrong.
You got [14] correct and guessed [23, 25, 58, 66] wrong. Powerball: wrong.
You got [27] correct and guessed [47, 52, 56, 58] wrong. Powerball: correct.
</code></pre>
<p>见:</p>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Big_O_notation" rel="nofollow noreferrer">Whats the fuss about the Big O of algorythms</a></li>
<li><a href="https://docs.python.org/3.8/library/stdtypes.html#frozenset" rel="nofollow noreferrer">set operations</a></li>
</ul>