2012-11-06 46 views
1

python新手 - 有人能告訴我我做錯了什麼嗎?Python-創建一個函數來獲取來自未知數量參數的唯一列表

我需要編寫一個函數,它接受未知數量的參數並返回一個唯一列表。 例如:

a= ['mary', 'james', 'john', 'john'] 
b= ['elsie', 'james', 'elsie', 'james'] 

unique_list(a,b) 

['mary', 'james','john', 'elsie'] 

這是一些我做了一些研究之後,但在輸出是不是我所需要的代碼:

def unique_list:(*something) 
    result1= list(something) 
    result = ' '.join(sum(result1, [])) 
    new= [] 
    for name in result: 
      if name not in new: 
          new.append(name) 
    return new 
  
>>> unique_list(a,b) 
['m', 'a', 'r', 'y', ' ', 'j', 'e', 's', 'o', 'h', 'n', 'l', 'i'] 

這又是一個我已經厭倦了:

def unique_list(*something): 
    result= list(something) 
    new=[] 
    for name in result: 
     if name not in new: 
      new.append(name) 
    return new 
 
>>> unique_list(a,b) 
[['mary', 'james', 'john', 'john'], ['elsie', 'james', 'elsie', 'james']] 

另一個之一,但我得到一個錯誤信息:

def single_list(*something): 
    new=[] 
    for name in something: 
     if name not in new: 
      new.append(name) 
    new2= list(set(new)) 
    return new2 
 
>>> single_list(a,b) 
Traceback (most recent call last): 
    File "", line 1, in 
    single_list(a,b) 
    File "", line 6, in single_list 
    new2= list(set(new)) 
TypeError: unhashable type: 'list' 

任何想法?預先感謝您的幫助。

回答

1

您可以連接所有lists,然後創建從這個list得到set。這適用於任何數量的名單通過工作,而且功能看起來像def unique_lists(*lists)

ret_list = [] 
for l in lists: 
    ret_list = ret_list + l 

return set(ret_list) 
+0

@ sean-這是完美的謝謝! – JJoseph

5

您可以使用set

def unique_list(a, b): 
    return list(set(a + b)) 

對於未知數量的參數,你可以用一個reduce一起添加所有的列表:

import operator 
def unique_list(*args): 
    return list(set(reduce(operator.add, args))) 

此輸出:

>>> a= ['mary', 'james', 'john', 'john'] 
>>> b= ['elsie', 'james', 'elsie', 'james'] 
>>> unique_list(a, b) 
['james', 'john', 'mary', 'elsie'] 
+0

如果有什麼是參數未知號碼? – JJoseph

+0

更新了答案。 – del

+0

@ del-謝謝你。真的很感激它。 – JJoseph

0

你正在尋找(我認爲)的功能是使一組兩個名單的組合,然後使其進入再次列表。像這樣:

list(set(list(a+b))) 

給出:['james', 'john', 'mary', 'elsie']

3

你想參數數目未知的:

In [73]: import itertools 

In [74]: def func(*args): 
    ...:  return set(itertools.chain(*args)) 

In [75]: func([1,2,3,4],[3,4,5],[1,2]) 
Out[75]: set([1, 2, 3, 4, 5]) 

或不itertools:

In [77]: def func2(*args): 
    ...:  setlist=[set(i) for i in args] 
    ...:  return set.union(*setlist) 

In [78]: func2([1,2,3,4],[3,4,5],[1,2]) 
Out[78]: set([1, 2, 3, 4, 5]) 
+0

這個作品謝謝你! – JJoseph

+0

@ user1667805 - 不客氣。增加了另一個選項,沒有itertools。 – root

3

在你的第二個嘗試,你幾乎得到了它對。

實際上,在那部分代碼中,您將每個列表視爲一個元素。您可能想要考慮列表中的每個元素。所以,你的代碼可能是:

def unique_list(*something): 
    result= list(something) 
    new=[] 
    for names in result: 
     for name in names: 
      if name not in new: 
       new.append(name) 
    return new 

這將有結果:

['mary', 'james', 'john', 'elsie'] 

關於第三個嘗試同樣的作品。請注意,在這種情況下,從列表中創建一個集合,然後從該集合中創建一個列表可能不會以與原始列表相同的順序返回元素。

根據你想要的,你也可以使用itertools.chain()。職能是:

import itertools 

def unique_list(*something): 
    return list(set(itertools.chain(*something))) 

其結果將是(記住,套不保持原來的順序):

['james', 'john', 'mary', 'elsie'] 
+0

@ ThiagoRRamos-感謝您指出有關集合和顯示另一種可能的解決方案 – JJoseph

1
a= ['mary', 'james', 'john', 'john'] 
b= ['elsie', 'james', 'elsie', 'james'] 
def unique_list(a, b): 
    a.extend(b) 
    return list(set(a)) 
+1

這並不能解決問題 - 列表元素在結果列表中重複出現。 – Tim

相關問題