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

时间:2018-01-29 07:07:13

标签: 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 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循环中尝试过的其他内容:

  1. 我知道三元组不能这样工作(至少在Python中不行),但这是我希望的简单管道:

    (bar if match == "bar" else foo) = match
    
  2. 删除功能不会返回任何内容:

    try:
        bar = matches.remove("bar")
    except KeyError:
        foo = matches.pop()
    

2 个答案:

答案 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.

在我们的案例中,这不是必需的。