2017-09-19 54 views
0

我有一個由某些類的對象,並在其尺寸不同的元組的列表:Python列表:只持有對象中元獲取字符串表示屬性

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,)。對不起,我忘記了,現在已經適應了我的問題!

+0

這裏的標準列表理解有什麼問題? –

+0

它不僅僅是對象,而是元組的字符串表示中的屬性。 –

+0

作爲一般技巧,您通常可以通過將其寫入實際for循環來查看理解結構。在這種情況下,你可以寫'obj1,obj2 in my_list'來取出元組,然後將''(%s,%s)'%(obj1.label,obj2.label)'附加到最初的空列表。你可以在下面的答案中看到相同的結構。編輯:剛纔看到了編輯。同樣的一般原則適用。 –

回答

1

另外兩個簡單列表理解的答案可以很好地適用於具有該屬性的任意對象元組列表。但是,Python具有一些很棒的內置功能,可以讓您選擇對象的字符串表示形式,而且大多數內置類型都已具有此功能。

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

現在,如果你這樣做與任意一組對象,那麼你會得到它具有一個字符串:例如,任何tuple只需通過包住tuplestr(tuple)被轉換爲它的字符串表示像<__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) 

[ '(object_1,object_2)', '(object_3,object_1)', '(object_4,object_1)', '(object_2,)' ]

現在我認爲這非常符合Python和非常清楚在後面的代碼,並定義__repr__只需要額外的代碼兩行。現在你可以print(my_obj),而不是print(my_obj.label)這很好的讀。

+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] 
+0

感謝您的回答。這是一個非常好的解決方案。不幸的是,我忘記了一個細節:元組有時是一維的,例如'(OBJ1)'。我會適應我的問題。抱歉! –

+0

@CordKaldemeyer編輯答案 – itzMEonTV

+0

工程就像一個魅力!你拯救了我的一天。謝謝! –

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] 
+0

感謝您的答案,看起來不錯。不幸的是,我忘記提及元組的維數不同。 –

+0

編輯我的答案。請注意,我使用python3 – Valdemar

0

您可以使用map函數來提供幫助。這可以在代碼

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

一條線是完整這也與一名維元組工作。

相關問題