Python-将2(或更少)项集转换为2个变量
我的代码可以工作,但我觉得while循环可能没有它可能的那么简洁 也许对一组2个或更少的项目使用while循环是愚蠢的?我不确定Python-将2(或更少)项集转换为2个变量,python,python-3.x,set,Python,Python 3.x,Set,我的代码可以工作,但我觉得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 ran
# <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)
try:
bar = matches.remove("bar")
except KeyError:
foo = matches.pop()
第一个代码中的循环是正常的,10000个输入在计算机规模上非常小 如果你想稍微快一点,你只需浏览你的列表
match
,而不用弹出元素(这需要更多的时间),只需简单地替换即可
while matches:
match = matches.pop()
借
第一个代码中的循环是正常的,10000个输入在计算机规模上非常小 如果你想稍微快一点,你只需浏览你的列表
match
,而不用弹出元素(这需要更多的时间),只需简单地替换即可
while matches:
match = matches.pop()
借
为什么不使用简单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.
在我们的例子中,这是不需要的。为什么不使用简单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.
在我们的情况下,这是不必要的。我没有理解你的意思。您添加了两个
if random.randint(0,3):
紧挨着彼此。为什么会这样?您可以复制第二个if
code并将其先附加到if
中,然后删除第二个if
@UmarAsghar如果我将if
语句组合成一个语句,那么只有两种可能的情况:“foo”和“bar”都添加到集合中,或者“foo”和“bar”都没有添加到集合中。然而,我想要四种可能的场景来显示我的数据集是什么样的:1。“foo”和“bar”都添加到set中。2.只是在集合中添加了“foo”。3.只是在集合中添加了“条”。4.设置中既没有添加“foo”也没有添加“bar”。好吧,这是因为你的要求。我没有理解你的意思。您添加了两个if random.randint(0,3):
紧挨着彼此。为什么会这样?您可以复制第二个if
code并将其先附加到if
中,然后删除第二个if
@UmarAsghar如果我将if
语句组合成一个语句,那么只有两种可能的情况:“foo”和“bar”都添加到集合中,或者“foo”和“bar”都没有添加到集合中。然而,我想要四种可能的场景来显示我的数据集是什么样的:1。“foo”和“bar”都添加到set中。2.只是在集合中添加了“foo”。3.只是在集合中添加了“条”。4.设置中既没有添加“foo”也没有添加“bar”。好的,这是因为您的要求。谢谢,我不知道为什么我忽略了这个。我想我以为pop()。但由于它是一个2项集,似乎可以忽略不计。不,它没有帮助。当脚本结束时,匹配的
内存空间立即被释放。如果弹出10000次,将有10000次内存释放尝试。即使要释放的内存量比整个集合少10000个,但这并不意味着需要少10000个时间(释放少量或大量内存在时间上是等效的)。谢谢,我不确定我为什么忽略了这一点。我想我以为pop()。但由于它是一个2项集,似乎可以忽略不计。不,它没有帮助。当脚本结束时,匹配的
内存空间立即被释放。如果弹出10000次,将有10000次内存释放尝试。即使要释放的内存量比整个集合少10000个,也不意味着需要少10000个时间(释放少量或大量内存在时间上是等效的)。