我的代码有效但我觉得while循环可能不是那么简洁。
对于一组2件或更少的项目,使用while循环可能是愚蠢的?我不确定。
# <SETUP CODE TO SIMULATE MY SITUATION>
import random
import re
# The real data set is much larger than this (Around 1,000 - 10,000 items):
names = {"abc", "def", "123"}
if random.randint(0, 3):
# foo value is "foo" followed by a string of unknown digits:
names.add("foo" + str(random.randint(0, 1000)))
if random.randint(0, 3):
# bar value is just "bar":
names.add("bar")
print("names:", names)
matches = {name for name in names if re.match("foo|bar", name)}
print("matches:", matches)
# In the names variable, foo and/or bar may be missing, thus len(matches) should be 0-2:
assert len(matches) <= 2, "Somehow got more than 2 matches"
# </SETUP CODE TO SIMULATE MY SITUATION>
foo, bar = None, None
while matches:
match = matches.pop()
if match == "bar":
bar = match
else:
foo = match
print("foo:", foo)
print("bar:", bar)
这是我在while循环中尝试过的其他内容:
我知道三元组不能这样工作(至少在Python中不行),但这是我希望的简单管道:
(bar if match == "bar" else foo) = match
删除功能不会返回任何内容:
try:
bar = matches.remove("bar")
except KeyError:
foo = matches.pop()
答案 0 :(得分:3)
第一个代码中的循环没问题,计算机规模的10,000个输入非常小。
如果你想稍快一些,你可以浏览你的列表match
而不需要弹出元素(这需要更多时间),简单地替换
while matches:
match = matches.pop()
通过
for match in matches:
答案 1 :(得分:1)
为什么不使用简单的for循环而不是while循环
for match in matches:
bar = match if match == 'bar' else foo = match
print("foo:", foo)
print("bar:", bar)
您不必每次都从集合中删除元素。由于您的集合仅包含2个或更少的元素:P。也许对于较大的集合,您可以在使用后删除整个集合
del matches # will help in garbage collection.
在我们的案例中,这不是必需的。