2012-10-16 58 views
1

我已經通過後搜索,但無法找到我面對的確切問題的解決方案。這很容易,但需要一點指導。在python列表中獨佔所有對

我有一個看起來像Python列表:

lst = ['bob/sally', 'bob/chris', 'bob/nate', 'sally/bob', ...] 

我想遍歷並打印獨特的對。所以在上面的例子中,它會發現bob/sally和sally/bob是一樣的,所以它會刪除一個。

任何幫助將不勝感激!我已經看到使用set()和其他python函數的貼子,但我不認爲這在這種情況下會起作用。

+0

我做你的列表包含字符串。我希望這就是你的意思(如果沒有,請糾正它) – mgilson

回答

3

你可以使用一組,並通過區分它們規範化名稱的順序:

>>> data = ['bob/sally', 'bob/chris', 'bob/nate', 'sally/bob'] 
>>> set(tuple(sorted(item.split('/'))) for item in data) 
set([('bob', 'chris'), ('bob', 'nate'), ('bob', 'sally')]) 

或由Ignacio Vazquez-Abramsmgilson使用frozenset已經指出的是更優雅和逃避的排序和元組()步:

set(frozenset(item.split('/')) for item in data) 
+0

是的,你剛剛打敗了我,這是imho實施的最佳方式。 - 但是,我會在最後把它轉換成一個列表。 –

+1

'tuple(sorted(item.split('/')))'對我而言有點密集。我更喜歡稍微簡單的:'frozenset(item.split('/'))' – mgilson

+0

@mgilson更加優雅 - 我同意。我總是忘記'frozenset' –

2

我已經使用set()看到帖子和其他Python功能,但我不認爲這會在這種情況下工作。

工作得很好,我...

>>> set([frozenset((x, y)) for (x, y) in [('bob', 'sally'), ('bob', 'nate'), ('sally', 'bob')]]) 
set([frozenset(['bob', 'sally']), frozenset(['bob', 'nate'])]) 
+0

這裏的訣竅是,由於'frozenset'是可散列的,因此OP需要使用'frozenset'作爲內部集合而不是'set'。 (+1 - 這是我要發佈的內容)。 – mgilson