使用list.index()来获取集合的索引有多大的风险?

时间:2013-11-10 12:23:41

标签: python list set

我想在一组字符串中查找并存储元素的索引。基本上,我有一组字符串。如果一个新字符串位于该集合中,我希望它被分配索引号。如果没有,我想将它添加到集合中,并分配一个新的索引号。

现在,我很确定我可以轻松地使用字典来完成这项工作。我想知道我是否可以做以下事情,但是:

s = set(['apple','banana','orange','mango','pineapple'])

if fruit in s:
    print list(s).index(fruit)
else:
    s.add(fruit)
    print list(s).index(fruit)

如果添加了新元素,或者添加了现有元素的新实例,现有元素的顺序是否会发生变化?我已经尝试过了,它似乎没有改变,但我想确定。

感谢。

3 个答案:

答案 0 :(得分:1)

  

如果添加了新元素,现有元素的顺序是否会改变[?]

它很容易改变。 set没有订单,你不能依赖它们在实践中插入订购:

>>> a = {"b", "c"}
>>> a
set(['c', 'b'])
>>> list(a).index("c")
0
>>> a.add("a")
>>> a
set(['a', 'c', 'b'])
>>> list(a).index("c")
1

答案 1 :(得分:1)

在集合上使用索引是个坏主意。集合是无序集合。

您可以在此处使用set和list的组合。设置为跟踪看到的项目和列表以保持插入顺序。

>>> lis = []
>>> seen = set()
>>> for x in ['apple','banana','orange']:
    if x not in seen:
        seen.add(x)
        lis.append(x)
...         
>>> if 'banana' in seen:
...     print lis.index('banana')
... else:
...     seen.add('banana')
...     lis.append('banana')
...     print len(lis)-1
...     
1
>>> if 'bar' in seen:
    print lis.index('bar')
else:
    seen.add('bar')
    lis.append('bar')
    print len(lis)-1
...     
3

风险:

订单完好无损:

>>> lis
['apple', 'banana', 'orange', 'bar']

list维护顺序,而list(set)以任意顺序返回项目。

>>> list(seen)
['orange', 'bar', 'apple', 'banana']

答案 2 :(得分:0)

集合是无序集合,如果您从集合中构建列表,则无法确定列表中的元素将始终具有相同的顺序。它可能会发生,但不能保证。