Python-将2(或更少)项集转换为2个变量

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

我的代码可以工作,但我觉得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)
  • remove函数不返回任何内容:

    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个时间(释放少量或大量内存在时间上是等效的)。