Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中更改for循环中的列表元素位置_Python_List - Fatal编程技术网

如何在Python中更改for循环中的列表元素位置

如何在Python中更改for循环中的列表元素位置,python,list,Python,List,我对编程相当陌生,我真的陷入了一个问题 假设我有以下清单: a = [2, "**", 2, "@"] 该列表可能包含更多元素 我需要做的是在“**”和“@”之间改变位置,这样我就可以 a = [2, "@", 2, "**"] 我一直在尝试使用for循环,使用元素索引来执行更改,但是列表索引超出了范围 我怎么做呢 这是我的密码: for j in range (len(expression)): if

我对编程相当陌生,我真的陷入了一个问题

假设我有以下清单:

a = [2, "**", 2, "@"]
该列表可能包含更多元素

我需要做的是在“**”和“@”之间改变位置,这样我就可以

a = [2, "@", 2, "**"]
我一直在尝试使用for循环,使用元素索引来执行更改,但是列表索引超出了范围

我怎么做呢

这是我的密码:

for j in range (len(expression)):
    if expression[j] == "**":
        if expression[j+2] == "@":
            expression[j], expression[j+2] = expression[j+2], expression[j]
print(expression)
试试下面的方法

# assuming "**" and "@" apper once in the list
a = [2, "**", 2, "@"]
idx_1 = a.index("**")
idx_2 = a.index("@")
# I need to change if and only if ** and @ are separated by another element
if abs(idx_1 - idx_2) > 1:
  del a[idx_1]
  a.insert(idx_1,"@")
  del a[idx_2]  
  a.insert(idx_2,"**")
print(a)
我在回答中的评论(尽管非常简单,待定)

说明:如果当前值为
**
,则您正试图访问
j+2
。但是,您的列表可能没有该索引(例如,如果
**
是最后一个元素怎么办?)。为了适应这种情况,我扩展了
if
语句,首先检查长度,然后检查
j+2
值。如果/当第一个检查/条件失败时,将跳过第二个条件(未检查),因此不会发生索引器


(更新了输入列表,以显示即使列表末尾的
***
也不会产生错误)

我想从列表中取出位置,然后交换它们

for idx , j in enumerate(a):
    if (j == "**"):
        pos1 = idx
    elif (j=="@"):
        pos2 = idx
    
a[pos1],a[pos2] = a[pos2],a[pos1]

请将您当前的代码添加到问题中。这是否回答了您的问题?是否要将所有
@
s更改为
**
s并将其反转?或者仅当**和@被另一个元素分隔时,我需要更改。有一个特别的订单。比如**,x,@在列表末尾之前结束循环2项:
对于范围内的j(len(表达式)-2):
,因为满足条件的匹配
“**”
不能是最后两项之一。删除和重新插入是低效和不必要的。只要做
a[idx_2]=“**”
等等。。。此外,它不满足项目必须由一个元素分隔的条件。@Thierrylahuille您是否在没有调用
del
的情况下尝试了代码?我喜欢您的答案@balderman以及您在那里的注释:)同样,删除一个值并在同一位置重新插入另一个值是一种完全低效的修改值的方式。因此,不要做
dela[i];a、 插入(i,新值)
,只需执行
a[i]=new\u值
。@Thierry Lathuille的评论也是避免该问题的好方法-请在问题评论中查看
for idx , j in enumerate(a):
    if (j == "**"):
        pos1 = idx
    elif (j=="@"):
        pos2 = idx
    
a[pos1],a[pos2] = a[pos2],a[pos1]