最Python式的方法来扩展潜在的不完整的lis

2024-09-27 00:17:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我要找的是最好的方式来说,'如果这个列表太短,请将其延长到9个元素,并添加'Choice 4'、'Choice 5'等作为附加元素。另外,将任何“None”元素替换为“Choice x”。也可以替换“”和0。在

转换的一个例子是

['a','b',None,'c']

^{pr2}$

我最初的代码滥用了try/except,并且出现了一个我没有注意到的off-by-one错误;感谢joeforker和所有指出它的人。基于这些评论,我尝试了两个同样有效的简短解决方案:

def extendChoices(cList):
  for i in range(0,9):
    try:
      if cList[i] is None:
        cList[i] = "Choice %d"%(i+1)
    except IndexError:
      cList.append("Choice %d"%(i+1)

以及

def extendChoices(cList):
  # Fill in any blank entries
  for i, v in enumerate(cList):
    cList[i] = v or "Choice %s" % (i+1)

  # Extend the list to 9 choices  
  for j in range(len(cList)+1, 10):
    cList.append("Choice %s" % (j))

我认为2胜是因为它更像Python,所以我会用它。它很容易理解并使用常见的构造。将步骤分开是合乎逻辑的,并且会使某人更容易一眼就明白。在


Tags: innone元素列表fordef方式range
3条回答

zip不同,Python的map自动用None扩展较短的序列。在

map(lambda a, b: b if a is None else a,
    choicesTxt,
    ['Choice %i' % n for n in range(1, 10)])

你可以把lambda简化为

^{pr2}$

如果可以将choicesTxt中的其他类假对象与None相同。在

我最初的反应是将列表扩展和“填空”分成不同的部分:

for i, v in enumerate(my_list):
    my_list[i] = v or "Choice %s" % (i+1)

for j in range(len(my_list)+1, 10):
    my_list.append("Choice %s" % (j))

# maybe this is nicer for the extension?
while len(my_list) < 10:
    my_list.append("Choice %s" % (len(my_list)+1))

如果您坚持使用try...except方法,那么一定要捕捉到Douglas所示的特定异常。否则,您将捕获所有内容KeyboardInterruptsRuntimeErrorsSyntaxErrors。你不想那样做。在

编辑:修复了1索引列表错误-谢谢DNS!在

编辑:添加了备选列表扩展名

我想我也会做一些类似的事情,但是要整理一下:

for i in range(0,10):
  try:
    if choicesTxt[i] is None:
      choicesTxt[i] = "Choice %d"%i
  except IndexError:
    choicesTxt.append("Choice %d"%i)

其中唯一重要的两个是只捕获IndexError,而不是任何异常,以及从0开始索引。在

而原始版本的唯一真正问题是如果choicesTxt为空,那么添加的选项将被关闭一个。在

相关问题 更多 >

    热门问题