具有可变长度的元组的Python列表:获取仅包含对象属性的元组的字符串表示

时间:2017-09-19 09:07:37

标签: python list tuples

我有一个元组列表,它由某个类的对象组成,并且它们的维度不同:

my_list = [(obj1, obj2), (obj3, obj1), (obj4, obj1), (obj2,),...]

所有这些对象都有一个属性label,其类型为string并保存一个对象标签,例如'object_1''object_2'等等。

现在我想提取包含属性值(标签)的元组的字符串表示,例如:

my_new_list = ['(object_1, object_2)', '(object_3, object_1)', '(object_4, object_1)', '(object_2,)', ...]

我已经从对象列表中查找了如何extract a list of attributes以及如何convert a tuple to string,并且可能会通过一些嵌套的for循环实现我的目标。但是我在这里陷入了一些混乱的代码......

但是,有没有一些不错的pythonic方法呢?

提前致谢!

*编辑:一些元组是一维的,例如(obj2,)。对不起,我忘记了,现在已经调整了我的问题!

5 个答案:

答案 0 :(得分:3)

你可以做到

["(%s, %s)" %(i.label, j.label) for i, j in my_list]

如果元组内有动态长度:

["(%s)" %", ".join([j.label for j in i]) for i in my_list]

答案 1 :(得分:1)

您可以使用list comprehension

['({}, {})'.format(el1.label, el2.label) for el1, el2 in my_list]

不依赖于元组维度使用辅助函数:

def tuple_print(tup):
    return '({})'.format(', '.join(t.label for t in tup))

my_new_list = [tuple_print(tup) for tup in my_list]

答案 2 :(得分:1)

另外两个简单的列表理解答案适用于具有该属性的任意对象元组列表。但是,Python有一些很棒的内置功能,可以让你选择对象的字符串表示,而且大多数内置类型都有这个功能。例如,只需将tupletuple包在一起,就可以将任何str(tuple)强制转换为字符串表示形式:

>>> str((5, 4))
'(5, 4)'

现在,如果您使用任意对象元组执行此操作,那么您将获得一个字符串,该字符串具有像<__main__.YourClass object at 0x10ad58fd0>这样丑陋的实际对象句柄。但是,如果在类定义中提供__repr__函数,则可以将该标准句柄更改为您喜欢的内容。在这种情况下,您的label似乎是一个很好的候选者,可以返回对象的字符串表示形式。这是使用相同代码创建的最小示例:

class LabeledObj:

    def __init__(self, label):
        self.label = label

    def __repr__(self):
        return self.label


obj1 = LabeledObj('object_1')
obj2 = LabeledObj('object_2')
obj3 = LabeledObj('object_3')
obj4 = LabeledObj('object_4')

my_list = [(obj1, obj2), (obj3, obj1), (obj4, obj1), (obj2,)]

my_new_list = [str(obj_tuple) for obj_tuple in my_list]
print(my_new_list)
  

[&#39;(object_1,object_2)&#39;,&#39;(object_3,object_1)&#39;,&#39;(object_4,object_1)&#39;,&#39; (object_2,)&#39;]

现在我认为这个非常pythonic,后面的代码非常清晰,定义__repr__只需要另外两行代码。现在你可以print(my_obj)而不是print(my_obj.label),它可以很好地阅读。

答案 3 :(得分:1)

元组列表元素计数 使用len()+生成器表达式

temp = list((int(j) for i in test_list for j in i)) 
res = len(temp)

答案 4 :(得分:0)

您可以使用map功能提供帮助。这可以在一行代码中完成

my_new_list = list(map(lambda P: '({})'.format(','.join(list(map(lambda t:t.label,list(P))))),my_list))

这也适用于一维元组。