从Python中的集合中选择一项

从Python中的集合中选择一项,python,python-2.7,set,Python,Python 2.7,Set,我希望从一组中选择一个项目。它是哪一项并不重要,但我希望每次调用函数时它都是同一项 例如,如果我有一套: my_set = set(["ABC","ABC inc", "ABC ltd"]) 然后我想返回其中的任何一个,但在函数运行时返回相同的一个。[也就是说,每当我运行上述集合时,我总是会得到“ABC”,或者总是得到“ABC inc”。]如果我使用列表,我只会获取第一项,但集合本身没有第一项 这与随机选择不同[例如]每次运行时都会更改的位置。转换为列表和排序如何 my_list = list

我希望从一组中选择一个项目。它是哪一项并不重要,但我希望每次调用函数时它都是同一项

例如,如果我有一套:

my_set = set(["ABC","ABC inc", "ABC ltd"])
然后我想返回其中的任何一个,但在函数运行时返回相同的一个。[也就是说,每当我运行上述集合时,我总是会得到“ABC”,或者总是得到“ABC inc”。]如果我使用列表,我只会获取第一项,但集合本身没有第一项


这与随机选择不同[例如]每次运行时都会更改的位置。

转换为列表和排序如何

my_list = list(my_set)
my_list.sort()
chosen_element = my_list[0]

您可以使用带有记忆的函数

def get_random(my_set,memo={}):
    if id(my_set) not in memo:
       memo[id(my_set)] = random.choice(list(my_set))
    return memo[id(my_set)]

a_set = set([1,2,3,4,5])
print get_random(a_set)
print get_random(a_set)
这将始终为您提供相同的值,只要您传入
一个集合
。。。(不同的一组会给出不同的答案)

如果您想确保项目仍然在集合中,您可以在检查时更改备忘录

def get_random(my_set,memo={}):
    if id(my_set) not in memo or memo[id(my_set)] not in my_set:
       memo[id(my_set)] = random.choice(list(my_set))
    return memo[id(my_set)]

集合被实现为哈希表。因此,除非插入/删除元素,否则顺序是确定的

假设x=set(['1','123','2','10'])

这个集合总是有一个顺序“1”、“2”、“123”、“10”(我猜是词典)


但是,如果要插入或删除一个元素,则必须使用某种排序功能使顺序具有确定性

我可能误解了您的问题,但如果您要查找任何特定的内容,则检查集合中的成员资格应该有效

letter_set = set(['abc','ABC','xyz','XYZ'])
check_string = 'ABC'
if check_string in letter_set:
    output = check_string
仅当所需字符串在集合中时,才应给出输出值。

使用


如果为空,则引发
ValueError
。从Python 3.4中可以返回一个默认值。

我找到的另一个答案是使用min:

elem = min(mySet)

调用
set
会出现错误,因为它需要一个iterable,而不是三个iterable,因为set是无序的。我能想到的唯一方法是比较每个元素的散列,直到找到与以前相同的散列的元素。我认为[此答案][1]可以帮助您。[1] :@Pynchia-很抱歉-更正了为什么要使用集合?如果有充分的理由,可以使用树或堆支持的集合。在很多方面都是危险的。例如,从集合中删除已记忆的项目,它仍将显示为答案。(在应用
random.choice
之前,您还需要列出
my_set
)这是OP要求的。。。您可以随时执行类似于
或memo[id(my_set)]的操作,而不是在my_set中执行
。。。我很快就遇到了使用这个问题[例如,当使用新值重新初始化集合时,返回了先前的结果]如果内存位置相同,那么它就是相同的集合,并且它返回给您它返回的第一个值。。。这就是我们所要求的。。。无论如何,我修改了它以检查集合中是否仍然存在项…如果内存也是一个问题,并且您不想在内存中复制集合,那么您可以从迭代器而不是随机获取第一个值。选择(列表(我的集合)),这是这种方法的一个优点,而不是生成一个列表。永远不要指望一个集合以特定的顺序遍历它的元素。我认为只要你使用pop拉出元素,你就应该做得很好,因为在pop之后,顺序仍然保持不变。你有没有一个例子可以解释为什么我应该“从不数数…”某种程度上。。。您可以将其组合为一个步骤:sorted(my_set)返回Python2和Python3中的列表。
elem = min(mySet)