【问题标题】:Replacing element in list without list comprehension, slicing or using [ ]s替换列表中的元素,无需列表理解、切片或使用 []s
【发布时间】:2023-04-06 02:21:01
【问题描述】:

I'm taking this online Python course 他们不喜欢学生使用单线解决方案。本课程不接受此解决方案的括号。

我已经使用列表理解解决了这个问题,但是课程拒绝了我的回答。

问题如下:

使用index 和其他列表方法,编写一个函数replace(list, X, Y),将list 中所有出现的X 替换为Y。例如,如果L = [3, 1, 4, 1, 5, 9]replace(L, 1, 7) 会将L 的内容更改为[3, 7, 4, 7, 5, 9]。为了让这个练习成为一个挑战,你不能使用[]

注意:你不需要使用return。

这是我目前所拥有的,但由于 TypeError: 'int' object is not iterable 而中断。

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)

这是我最初的答案,但被拒绝了。

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)

关于如何解决我的较长解决方案的任何想法?

【问题讨论】:

  • 你的解决方法不对,应该是:print([Y if v == X else v for v in list])
  • 试试for i, v in enumerate(list):
  • @Serdalis。你说得对。课程仍然不会接受该答案。
  • @Serdalis 该解决方案也不正确,因为它没有修改传递给它的列表,这是一个要求。
  • @Sven Marnach。我们不允许使用枚举。不是和in range(len(list))一样吗?

标签: python list replace list-comprehension


【解决方案1】:

range() 返回整数的平面列表,因此您不能将其解压缩为两个参数。使用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)

如果您不允许使用 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)

最后,您可以使用问题作者可能正在寻找的内容(尽管这是最低效的方法,因为它会在每次迭代时线性搜索列表):

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)

【讨论】:

  • @SvenMarnach 你是对的。我想到的方法是pop
  • @Serdalis 这个问题不允许它(无论出于何种原因)。
  • 对不起,我误读为“不能使用列表构造函数”。你是对的。
  • @Asad。我们不允许使用枚举。不是和in range(len(list))一样吗?
  • @StacyM:如果不允许使用enumerate,则可以使用手动索引变量,并在for 块的末尾执行i += 1
【解决方案2】:

您也可以试试这个(不使用[]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

这可能不是作业要你做的,但我会把它留在这里用于学习目的。

注意:您不应该使用list 作为变量名,因为它已被内置函数使用。我在这里使用了l

【讨论】:

    【解决方案3】:

    如果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]
    

    【讨论】:

      【解决方案4】:

      不要使用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))
      

      【讨论】:

        【解决方案5】:

        这对我有用。很直接。可能是一种减少行数的方法,但根据目前网站上所教的内容,这是可行的。

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

        【讨论】:

          【解决方案6】:

          完全同意 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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-07-17
            • 2015-08-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多