用Python替换特定集合元素的方式是什么?

16

我有一个 Python 集合 set([1, 2, 3]),我想将集合中的第三个元素替换为另一个值。

可以像下面这样实现:

def change_last_elemnent(data):
    result = []
    for i,j in enumerate(list(data)):
        if i == 2:
            j = 'C'
        result.append(j)
    return set(result)

但是是否有其他更符合 Python 风格的方法,更加智能和易读?

提前致谢。


10
“一个集合的第三个元素”是什么意思?由于集合没有顺序,所以在不同的实现或运行中,第三个元素可能会有所不同。 - mmmmmm
2
如果你想要“第三个”元素或“最后一个”元素的概念,可以使用列表。 - Skylar Saveland
1
@caveman:我同意这个观点,问题确实有些奇怪。但你可能有一些动机或目标。你能更好地解释一下你想要实现什么吗?是否有任何未明说的标准使得这些值被排序?例如,如果你指的是排序后的第三个元素,那么data.remove(sorted(data)[2])可能是答案。我不确定C的目的是什么。 - pepr
1个回答

29
集合是无序的,因此“第三个”元素并没有实际意义。这将会删除一个任意元素。
如果这正是您想要做的事情,您可以简单地执行以下操作:
data.pop()
data.add(new_value)

如果您希望通过值来删除集合中的项目并替换它,可以执行以下操作:
data.remove(value) #data.discard(value) if you don't care if the item exists.
data.add(new_value)

如果您希望保持有序的数据,请使用列表并执行以下操作:
data[index] = new_value

为了表明集合是无序的:
>>> list({"dog", "cat", "elephant"})
['elephant', 'dog', 'cat']
>>> list({1, 2, 3})
[1, 2, 3]

你可以看到,'3'是由集合{1, 2, 3}制作的列表中的第三个元素,这只是CPython实现的巧合。
你的示例代码还存在其他严重问题。 new_list不存在。在任何时候都没有从列表中删除旧元素,循环遍历列表的行为完全无意义。显然,所有这些都并不重要,因为整个概念都是有缺陷的。

新列表是一个打字错误,应该是结果。 - mushfiq
1
@caveman 这并不重要。循环遍历列表来更改元素是完全不必要的,你可以用result = list(data) result[2] = "C" return set(result) 来替换整个函数 - 然而,你试图执行的操作是毫无意义的,原因在我的帖子中已经给出。 - Gareth Latty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接