【问题标题】:Is there a way to add things to a list in a for loop without initializing the list before the for loop?有没有办法在 for 循环中将内容添加到列表中而无需在 for 循环之前初始化列表?
【发布时间】:2022-01-03 04:24:13
【问题描述】:

我正在尝试对具有多个属性的类进行排序并将它们中的每一个放入一个列表中。这被用于单元测试以确认我的班级正在正确排序它们。有没有一种方法可以创建一个列表并在 for 循环内的一行(如列表理解)中添加内容?

例如,为了立即对它们进行排序,我必须使用类似这样的东西:

objectsObject 类项的列表

red_objects = []
blue_objects = []
green_objects = []
for object in objects:
    if object.color == 'red':
        red_objects.append(object.name)
    elif object.color == 'blue':
        blue_objects.append(object.name)
    elif object.color == 'green':
        green_objects.append(object.name)

或类似的东西:

red_objects = [object.name for object in objects if object.color == 'red']
blue_objects = [object.name for object in objects if object.color == 'blue']
green_objects = [object.name for object in objects if object.color == 'green']

显然,第二个选项更简洁,但是我必须分别运行循环三次。是否有某种方法可以将这两种方法结合起来,所以我只能通过循环运行一次,但我可以以类似于列表理解的方式创建列表?

【问题讨论】:

  • collections.defaultdict 在这种情况下非常有用。在初始化by_color = defaultdict(list) 之后,你的循环体就是by_color[object.color].append(object.name)。结果在by_color['red'],以此类推。
  • @jasonharper 我真的很喜欢这个解决方案。我不知道defaultdict 是如何工作的,我实际上可以在我的测试之外的其他地方实现它。谢谢!

标签: python python-3.x list list-comprehension


【解决方案1】:

也许使用dict:

red_objects, blue_objects, green_objects = [],[],[]
my_dict = {'red': red_objects.append, 'blue': blue_objects.append, 'green': green_objects.append}

for object in objects:
    my_dict[object.color](object.name)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-23
    • 2020-03-23
    • 1970-01-01
    • 2014-02-14
    • 2021-07-14
    • 2015-11-28
    • 2016-08-25
    • 1970-01-01
    相关资源
    最近更新 更多