2010-05-13 63 views
0

所以我有一个列表,我想要将其转换为包含每个对象组列表的列表。在Python中组织随机对象列表

即 [ 'objA.attr1', 'objC', 'objA.attr55', 'objB.attr4'] 将返回 [[ 'objA.attr1', 'objA.attr55'],[” objC“],[” objB.attr4' ]

目前这是我使用:

givenList = ['a.attr1', 'b', 'a.attr55', 'c.attr4'] 
trgList = [] 
objNames = [] 
for val in givenList: 
    obj = val.split('.')[0] 
    if obj in objNames: 
     id = objNames.index(obj) 
     trgList[id].append(val) 
    else: 
     objNames.append(obj) 
     trgList.append([val]) 
#print trgList 

它似乎运行速度不俗当原始列表中有10万左右的id ...但我我很好奇,如果有更好的方法来做到这一点。对象或属性的顺序无关紧要。有任何想法吗?

+0

@Saebin:你的问题属于我们的姊妹网站Stack Overflow,很快就会迁移到这里。您需要在此处注册您的账户,在Stack Overflow上注册一个账户,并将它们关联在一起以重新获得问题的所有权。 – 2010-05-13 19:39:45

回答

0

这需要更好的定义:当没有财产时你会做什么?你想要最终名单的顺序是什么?那些重复的东西呢?

一般算法是使用多重映射:每个键具有多个值的映射。 然后,您将扫描原始列表,将每个元素分隔为“对象”和“属性”,然后为对象和属性添加键值对。在此循环结束时,您将有一个从对象到属性集的映射。然后你可以遍历这个来建立你的最终列表。

您可以使用第三方multimap或通过映射到序列来实现自己。

您可能希望为对象没有属性的情况创建一个虚拟属性。

+0

重复不会发生,组的顺序和它们的属性无关紧要。如果一个对象没有给出属性,那么一个组仍然需要创建,它不会包含属性(还)。 我没有提到的最大限制是原始的object.property字符串必须被保留......否则当我将它传递给其他函数时,我将不得不重建object.property字符串。因此,尽管我可以使用类似字典的东西来存储结果,例如d [object1 = ['attr1','attr2']],但最终我需要将对象和属性放回到每个属性中。 – Saebin 2010-05-13 23:44:29