循环字符串列表并执行任务(介绍Python练习第2章)

2024-10-02 22:25:49 发布

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

在哪里询问我的代码是否清晰和良好。 因此,我有三项任务要做:

enter image description here

所以我试着循环它,并在一个循环中完成所有操作。 希望有一些反馈,有一个好的

names = ['mozzarella', 'cinderella', 'salmonella']
for i in range(len(names)):
  for name in names:
    if name == 'cinderella':
        names[i] = name.capitalize()
        i += 1
    elif name == 'mozzarella':
        names[i] = name.upper()
        i += 1
    elif name == 'salmonella':
        names.remove(name)

输出:

['MOZZARELLA', 'Cinderella']

Tags: 代码nameinforlenifnamesrange
3条回答

这里不需要进行两次迭代。您可以为range()执行一个操作,然后通过names[i]直接调用列表i是它正在迭代的范围中的当前位置,因此当您调用names[i]时,它会在列表中调出该索引

for i in range(len(names)):
    if names[i] == 'mozzarella': 
        names[i] = names[i].upper()
    if names[i] == 'cinderella': 
        names[i] = names[i].capitalize()
    if names[i] == 'salmonella': 
        names.remove(names[i])

names
['MOZZARELLA', 'Cinderella']

有几件事我会做得不同(因为你问的是如何编写干净的代码,我要解决的不仅仅是函数的准确性)。 通常,在处理具有不同关注点的问题时,将这些关注点分开通常是有用的。 在这种情况下,我不知道为什么要在同一个循环中管理所有3个关注点。 在软件中,您经常会发现一个关注点的发展速度与其他关注点的发展速度不同。 此外,在列表上迭代时删除元素通常不是一个好主意。我将使用类似以下内容:

def update_cheesy(name):
    if name == 'mozzarella':
        return name.upper()
    return name

def update_person(name):
    if name == 'cinderella':
        return name.capitelize()
    return name

names[:] = [update_person(name) for name in names]
print(names)
names[:] = [update_cheesy(name) for name in names]
print(names)
names[:] = [name for name in names if name != 'salmonella']
print(names)

请注意,赋值是对名称[:]而不是名称进行的。这将替换列表的内容,而不仅仅是将命名引用设置为其他列表

如果您认为这样更干净,您可以将所有修改合并到一个调用中

我认为您可以在这里使用pythonreduce或简单的forloop

base_names = ['mozzarella', 'cinderella', 'salmonella']

# using forloop
result = []
for name in base_names:
    if name == 'salmonella':
        continue
    elif name == 'cinderella':
        name = name.capitalize()
    elif name == 'mozzarella':
        name = name.upper()
    result.append(name)
print(result)


# using reduce
from functools import reduce # for python3

def reduce_fuc(acc, name):
    if name == 'salmonella':
        return acc
    elif name == 'cinderella':
        name = name.capitalize()
    elif name == 'mozzarella':
        name = name.upper()
    acc.append(name)
    return acc

names = reduce(reduce_fuc, base_names, [])
print(names)

两种方法都返回相同的结果,但都不修改base_name列表,而是生成包含结果的新列表

相关问题 更多 >