2012-01-30 67 views
3

替換列表中的值。如果我有一個列表:使用Python元組

my_list = [3,2,2,3,4,1,3,4] 

和一個元組

my_tuple = (3,5) 

什麼是使用元組my_list替換元素的最佳方式:

result = [5,2,2,5,4,1,5,4] 

eg

for item in my_list: 
    if(item == my_tuple[0]): 
     item = my_tuple[1] 

更一般地,我將有一個列表的列表,以及一個元組列表,我想每個元組的名單列表內,向每個列表。

+0

您的示例中的方法基本上是正確的,但分配不起作用,因爲您正在處理列表中值的副本。如果符合條件,您需要枚舉列表並將正確的索引值替換。 (列表理解對於簡單的情況更好,但對列表和元組列表可能會變得很難看)。 – geoffspear 2012-01-30 16:27:18

+0

我仍然對python製作副本和使用引用感到困惑...... – tdc 2012-01-30 16:42:35

+0

不要混淆,它確實很簡單:Python *總是使用引用。* – kindall 2012-01-30 17:13:11

回答

10

my_tuple更自然的數據結構是一本字典。考慮這樣的事情,並使用.get()方法:

>>> my_lists = [[3,2,2,3,4,1,3,4], [1,2,3,4,5,6]] 
>>> my_tuple_list = [(3,5), (6, 7)] 
>>> my_dict = dict(my_tuple_list) 
>>> my_dict 
{3: 5, 6: 7} 
>>> my_lists = [[my_dict.get(x,x) for x in somelist] for somelist in my_lists] 
>>> my_lists 
[[5, 2, 2, 5, 4, 1, 5, 4], [1, 2, 5, 4, 5, 7]] 
+0

'get(x,x)'...那很美! – juliomalegria 2012-01-30 16:31:43

+0

完美!沒有想過使用字典,理所當然。 – tdc 2012-01-30 16:40:47

1

如果你想與5更換每3在列表中,這會做:

[x == my_tuple[0] and my_tuple[1] or x for x in my_list] 

如果你想這樣做,有一個以上的「平移」的元組,那麼我真的建議改用字典:

trans = {3: 5, 4: 6} 
[trans.get(x,x) for x in my_list] 

而且在你有一個以上的列表更一般的情況:

ll = [[3, 2, 3, 4], [5, 4, 3, 4]] 
trans = {3: 5, 4: 6} 
for i in range(len(ll)): 
    ll[i] = [trans.get(x,x) for x in ll[i]] 

假設您要將ll中的每個舊列表替換爲新列表。

+0

這隻適用於單個列表和元組。 – 2012-01-30 16:24:50

+0

@PlatinumAzure:OP問及如何做到這一點,更一般地說,有多個列表和翻譯元組。我剛剛更新了我的答案。 – 2012-01-30 16:29:23

0

使用,如果項目== my_tuple [0],...在一般情況下,聽起來像您這樣的,你要應用到每個項目switch語句在你的清單中。如果可以,請使用字典。 (Why isn't there a switch or case statement in python?

轉換你的元組的列表,查找字典(Python的switch語句):

replacements = dict(my_tuples) #thanks to @julio 

那麼對於一個列表,複製與修真之列,但與新值替換每個值從替代品,如果它存在:

replaced_list = [replacements.get(original,original) for original in my_list] 

我想有一個更有效的方式來做到這一點,但是這對於一個元組列表一個列表。你說你還需要做一個清單列表?只是窩?

您能否解釋更多關於您獲取此數據的位置以及爲何需要這樣做?

+0

更多pythonic:'替換=字典(my_tuples)' – juliomalegria 2012-01-30 16:32:42

+0

我不知道。謝謝,我會更新答案。更重要的是,我錯過了沒有更換所有物品的情況。 – KobeJohn 2012-01-30 16:36:07

3

Per @ Wooble的評論,如果你列舉的話,你的代碼將起作用。

list_of_lists = [[3,2,2,3,4,1,3,4], [1,3,5,3,4,6,3]] 
list_of_tuples = [(3,5), (1,9)] 

def tup_replace(mylist, mytuple): 
    for i, item in enumerate(mylist): 
     if item == mytuple[0]: 
      mylist[i] = mytuple[1] 
    return mylist 

然後,你可以嵌套一些更多的工作列表和元組列表的列表。

for mylist in list_of_lists: 
    for mytuple in list_of_tuples: 
     mylist = tup_replace(mylist, mytuple) 
    print mylist 

也就是說,字典的方法可能會更好。

+1

+1,因爲我認爲使用不同方法得到各種答案(即使有些方法效率較低)比一系列相互演變的類似答案更有意義。恕我直言,每個問題通常應該至少有兩個答案:一個,解釋如何解決OP代碼中的明顯問題,以及兩個,解釋OP如何真正解決問題。 – DSM 2012-01-30 16:48:24