简体   繁体   English

替换列表中的元素没有列表理解,切片或使用[] s

[英]Replacing element in list without list comprehension, slicing or using [ ]s

I'm taking this online Python course and they do not like the students using one-line solutions. 我正在参加这个在线Python课程 ,他们不喜欢使用单行解决方案的学生。 The course will not accept brackets for this solution. 该课程不接受此解决方案的括号。

I already solved the problem using list comprehension, but the course rejected my answer. 我已经使用列表理解解决了问题,但课程拒绝了我的答案。

The problem reads: 问题是:

Using index and other list methods, write a function replace(list, X, Y) which replaces all occurrences of X in list with Y . 使用index和其他清单方法,编写一个函数replace(list, X, Y)它取代所有出现的XlistY For example, if L = [3, 1, 4, 1, 5, 9] then replace(L, 1, 7) would change the contents of L to [3, 7, 4, 7, 5, 9] . 例如,如果L = [3, 1, 4, 1, 5, 9]replace(L, 1, 7)L的内容改变为[3, 7, 4, 7, 5, 9] To make this exercise a challenge, you are not allowed to use [] . 要使此练习成为一项挑战,您不能使用[]

Note: you don't need to use return. 注意:您不需要使用return。

This is what I have so far, but it breaks because of TypeError: 'int' object is not iterable. 这是我到目前为止,但由于TypeError而中断:'int'对象不可迭代。

list = [3, 1, 4, 1, 5, 9]

def replace(list, X, Y):
   while X in list:
      for i,v in range(len(list)):
         if v==1:
            list.remove(1)
            list.insert(i, 7)

replace(list, 1, 7)

This was my original answer, but it was rejected. 这是我原来的答案,但遭到拒绝。

list = [3, 1, 4, 1, 5, 9]

def replace(list, X, Y):
   print([Y if v == X else v for v in list])

replace(list, 1, 7)

Any ideas on how to fix my longer solution? 关于如何修复我的更长解决方案的任何想法?

range() returns a flat list of integers, so you can't unpack it into two arguments. range()返回一个整数的平面列表,因此您无法将其解压缩为两个参数。 Use enumerate to get index and value tuples: 使用enumerate获取索引和值元组:

def replace(l, X, Y):
  for i,v in enumerate(l):
     if v == X:
        l.pop(i)
        l.insert(i, Y)

l = [3, 1, 4, 1, 5, 9]
replace(l, 1, 7)

If you're not allowed to use enumerate , use a plain old counter: 如果您不允许使用enumerate ,请使用普通的旧计数器:

def replace(l, X, Y):
  i = 0
  for v in l:
     if v == X:
        l.pop(i)
        l.insert(i, Y)
     i += 1

l = [3, 1, 4, 1, 5, 9]
replace(list, 1, 7)

Finally, you could use what the authors of the question were probably looking for (even though this is the most inefficient approach, since it linear searches through the list on every iteration): 最后,你可以使用问题的作者可能正在寻找的东西(尽管这是最低效的方法,因为它在每次迭代时线性搜索列表):

def replace(l, X, Y):
  for v in l:
     i = l.index(v)
     if v == X:
        l.pop(i)
        l.insert(i, Y)

l = [3, 1, 4, 1, 5, 9]
replace(l, 1, 7)

You can also try this (not using [] s or enumerate() , as required): 您也可以尝试这个(不要使用[] s或enumerate() ,如果需要):

for i in range(len(l)):  # loop over indices
    if l.__index__(i) == X:  # i.e. l[i] == X
        l.__setitem__(i, Y)  # i.e. l[i] = Y

This probably isn't what the assignment wants you to do, but I'll leave it here for learning purposes. 这可能不是作业要求你做的,但我会把它留在这里用于学习目的。

Note: You shouldn't use list as a variable name since that's already used by a built-in function. 注意:您不应该使用list作为变量名,因为它已经被内置函数使用。 I've used l here instead. 我在这里用过l

If enumerate is not allowed, you can also use a while loop. 如果不允许enumerate ,您还可以使用while循环。

>>> def replace(L_in, old_v, new_v):
        while old_v in L_in:
            idx=L_in.index(old_v)
            L_in.pop(idx)
            L_in.insert(idx, new_v)


>>> L = [3, 1, 4, 1, 5, 9]
>>> replace(L, 1, 7)
>>> L
[3, 7, 4, 7, 5, 9]

Do not use list as a name, it will cause you much pain. 不要使用list作为名称,它会给你带来很大的痛苦。

def replace(my_list, X, Y):
    while X in my_list:
        my_list.insert(my_list.index(X), Y)
        my_list.pop(my_list.index(X))

This worked for me. 这对我有用。 Pretty straight forward. 挺直的。 Probably a way of doing it with less lines, but based on what has been taught on the website so far, this works. 可能是一种用较少的线条来实现它的方法,但是基于到目前为止在网站上所教授的内容,这是有效的。

def replace(L, X, Y):
   while X in L:
      i = L.index(X)
      L.insert(i, Y)
      L.remove(X)

totally agree with Asad Saeeduddin but, 1st value of i must be -1, it will help replace the 1st object in list in need 完全同意Asad Saeeduddin但是,i的第一个值必须为-1,它将有助于替换列表中的第一个对象

def replace(l, X, Y):
    i = -1
    for v in l:
        i += 1
        if v == X:
            l.pop(i)  # remove item at given position (position number i)
            l.insert(i, Y)  # insert item Y at position i

l = [1, 1, 4, 1, 5, 9]
replace(l, 1, 7)
print(l)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM