【问题标题】:Return multiple instances from an object in python从python中的对象返回多个实例
【发布时间】:2016-08-18 06:11:53
【问题描述】:

这个问题毫无疑问以前被问过,但我不完全确定如何搜索它(因为我不知道它叫什么)。所以提前道歉。

唉,我的问题是我有大量的对象

for i in range(1000):
    M = subParts[0].get(parts['thing'][i])

每个M 都是一个对象,其中包含有关此模型的大量信息,现在我的工作是在此对象上调用四个单独的函数,以便这些函数可以返回四个简单的数字:

for i in range(1000):
    M = subParts[0].get(parts['thing'][i])
    M.getItem1()
    M.getItem2()
    M.getItem3()
    M.getItem4()

每个都返回一个数字,例如

4.5
5.7
3.7
2.9

因此,我的问题是,什么是有效的方法?上面很丑但是有效,但必须有更有效的方法。在此我只想将全部内容存储在字典中

myDict = { 0 : [4.5,5.7,3.7,2.9], ... , 999 : [2.5,3.7,5.7,2.9] }

谢谢。

【问题讨论】:

  • 键是从0开始的连续数字的字典本质上只是一个列表。
  • 这只是为了演示 :) 当然你当然是正确的。
  • 我注意到您每次迭代都会检索 subParts[0]parts['thing'],提前存储它们 (relevant_part = parts["thing"]) 可能会简化该语句并减少重复查找。
  • 实际上,如果parts['thing'] 是一个(有序)序列,您可以使用for M in map(subParts[0].get, parts["thing"]): 遍历所有M 对象。
  • 对..这比我所做的要聪明得多。谢谢

标签: python dictionary optimization


【解决方案1】:
def getdata(m):
    return [m.getItem1(), m.getItem2(), m.getItem3(), m.getItem4()]

myDict = {i: getdata(subParts[0].get(parts['thing'][i])) for i in range(1000)}

【讨论】:

    【解决方案2】:

    假设parts['thing'] 是一个可以迭代的有序序列,您可以使用mapparts['thing'] 的每个元素上调用subParts[0].get,因此迭代每个M 对象可以这样完成:

    for M in map(subParts[0].get, parts['thing']):
        ...
    

    请注意,这将在 python 2 中返回一个列表,因此最好使用itertools.imap

    要将其放入字典理解中,您只需这样做:

    stuff = {i:[M.getItem1(),
                M.getItem2(),
                M.getItem3(),
                M.getItem4()]
             for i,M in enumerate(map(subParts[0].get, parts['thing']))}
    

    【讨论】:

    • from operator import attrgetter 方法似乎更优雅?为什么不建议这样做?
    • 它检索M.getItem1 绑定方法,但不调用它,attrgetter 不是为此而设计的,因此添加该步骤并不容易。
    • 如果您要检索 M.Item1 之类的属性,则使用 attrgetter 会很完美,但在这种情况下获取绑定方法的元组将无济于事。
    猜你喜欢
    • 2021-06-30
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多