[当整数重复时如何交换列表中的整数

问题描述 投票:0回答:4

我的列表中不包含随机整数。我想交换元素,同时保持列表的顺序不变。

ran=[1,1,2,1]

并且我想交换1和2:

swap(ran,1,2)
output:
2212

ran=[3,3,1,2]
swap(ran,1,3)
output:
1132

我尝试了交换函数,但是我知道我的迭代逻辑不是很好。

def swap(c,x,y):

arr=[]

for i, v in enumerate(c):
        if v==x or v==y:
            for j,v2 in enumerate(c):
                if v2==y or v2==x:
                    arr[i], arr[j] = arr[j], arr[i]

这只是更改其中一个值。

问题不知道哪个索引已被更改。

python list swap
4个回答
1
投票

您提供的示例表明,所需的过程实际上并不是单个元素的“交换”,而更像是双向的“搜索和替换”。如果需要的话,可以使用更简单的循环:

def swap(c, x, y):
  for i, v in enumerate(c):
    if v == x:
      c[i] = y
    elif v == y:
      c[i] = x

0
投票

使用字典对交换逻辑进行编码,并使用get(e, e)对其进行索引。词典中未包含的所有不可交换元素将被保留。

>>> def swap(lst, x, y):
...     swaps = {x: y, y: x}
...     return [swaps.get(e, e) for e in lst]
...
>>> swap([1, 1, 2, 1], 1, 2)
[2, 2, 1, 2]

您可以通过让调用者传入字典以指定交换来对此进行概括。这是closely related question


0
投票

您可以定义一个字典,其中包含您要进行的更改,然后遍历列表。使用.get(el,el),您将在swap dict中获得相应的元素(如果存在),或者如果未定义任何替换,则获得相同的元素。

>>> ran = [1,1,2,1]
>>> swaps = {2:1,1:2}
>>> str.join('',[str(swaps.get(el,el)) for el in ran])
'2212'

或简单地作为列表

>>> res = [swaps.get(el,el) for el in ran]
>>> res
[2, 2, 1, 2]

0
投票

我认为您可以使用类似这样的内容:

def swap(lst,x,y):
    ret = lst
    for e in range(0,length(lst)):
        if x == lst[e]:
            ret[e] = y
        if y == lst[e]:
            ret[e] = x
    return ret
© www.soinside.com 2019 - 2024. All rights reserved.