【问题标题】:Can I modify a specified single value in a list?我可以修改列表中指定的单个值吗?
【发布时间】:2020-11-29 09:43:18
【问题描述】:

我需要能够打印一个列表,其中我将列表中的所需值标记为“XX”,即从“XX”开始。我的麻烦是我正在使用嵌套列表并且不确切知道我应该如何找到某个值。我也不知道我是否能够将整数更改为字符串,或者这是否会弄乱列表的整个打印方式。我“标记”该值的函数如下所示:

  i = 0
  while i <= len(chosenseat):
    findseat = field.index(chosenseat[i])
    field[findseat] = "*"+chosenseat[i]+"*"
    for idx, row in enumerate(field):
        if idx == floor(len(field) / 2):
            print("{:^{}}".format('↓ TYST AVD ↓', (len(row) * 4) - 2))
        if idx % 2 == 1:
            row = row[::-1]
        print(("{:<4}" * len(row)).format(*row))
    i += 1

(我在 StackOverflow 上从 Hampus Larsson 获得了上面的大部分代码!)

整个程序是火车车厢的订票系统,我希望能够在预定座位时用“**”标记所需的座位。打印列表时,它看起来像:

  1   2   3   4   
  8   7   6   5   
  9   10  11  12  
   ↓ TYST AVD ↓ 
  16  15  14  13 
  17  18  19  20  
  24  23  22  21 

如果用户想要 19 和 20 号座位,则列表应打印为:

 1   2   3   4   
 8   7   6   5   
 9   10  11  12  
  ↓ TYST AVD ↓ 
 16  15  14  13  
 17  18 *19**20*  
 24  23  22  21

我遇到的另一个问题是,在解开票时,“**”应该被删除,但我目前甚至无法将星星固定到位。有人可以指导我吗?

【问题讨论】:

  • 你能发布你的字典是什么样子的吗?
  • @Crapy 请原谅我的提问,但什么是字典?

标签: python list output


【解决方案1】:

我试图了解您的初始列表是什么,假设我做得正确,这可能是一个解决方案:

import copy

seatList = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16], [17, 18, 19, 20]]
chosenseat = [11, 12]

def find_in2Dlist(lst, item):
    for index, sublist in enumerate(lst):
        try:
            idx = sublist.index(item)
            return [index, idx]
        except: continue
    return None
            

def printList(mlist, chosenseat):
  i = 0
  temp = copy.deepcopy(mlist)
  while i < len(chosenseat):
      findseat = find_in2Dlist(mlist, chosenseat[i])
      if findseat == None:
          i += 1
      else:
          temp[findseat[0]][findseat[1]] = '*' + str(mlist[findseat[0]][findseat[1]]) + '*'
      i += 1
  
  for idx, row in enumerate(temp):
        if idx == len(temp) // 2:
            print("{:^{}}".format('↓ TYST AVD ↓', (len(row) * 4) - 2))
        if idx % 2 == 1:
            row = row[::-1]
        print(("{:<4}" * len(row)).format(*row))
   
def printInitialList(mlist):
    print(mList)

printList(seatList, chosenseat) #=>
# 1   2   3   4   
# 8   7   6   5   
# 9   10  11  12  
#  ↓ TYST AVD ↓ 
# 16  15  14  13  
# 17  18  *19**20*
# 24  23  22  21 

编辑:因为printList 使用了初始列表的副本,所以这个保持不变并且可以重复使用:

print(seatList) #=>
# 1   2   3   4   
# 8   7   6   5   
# 9   10  11  12  
#  ↓ TYST AVD ↓ 
# 16  15  14  13  
# 17  18  19  20
# 24  23  22  21 

【讨论】:

  • 非常感谢您,这真的很有帮助!只是一个小问题,假设一个座位未预订,我将如何从列表中的座位中删除“**”?我可以轻松添加一两行以使其能够删除它们还是完全需要其他功能?
  • printList 的开头,我复制了列表:temp = mlist.copy(),并在temp 中添加了“*”字符,而不是在给定列表中。这意味着初始列表保持不变,您可以重复使用它。该解决方案是否符合您的需求?
  • 是的,有点。一旦我从“chosenseat”变量中删除一个对象,我就试图让它重新打印列表,但它没有这样做。一旦我从该列表中删除一个对象,它就会将 ** 保留在那里,尽管从代码来看,它应该再次打印主列表,因此当我再次调用它时删除 **。我错过了什么吗?
  • 啊,是的,我们必须在这里使用deepcopy 而不是copy,否则子列表不会与顶级列表一起复制。我已经在我的回答中解决了这个问题。
  • 成功了!我永远感激不尽,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 2015-07-29
  • 1970-01-01
  • 2021-11-10
相关资源
最近更新 更多