2014-09-24 123 views
-2

我有一個包含元組的列表,我想用'None'字符串替換其中一個元組中的None對象。ValueError迭代Python中的元組列表

這裏是我的代碼:

x = [('hello','there'),(None,'world',None)] 
for i in x: 
    for j in i: 
     if j is None: 
      n = x.index(i) 
      l = list(x[n]) 
      m = x[n].index(j) 
      l[m] = 'None' 
      x[n] = tuple(l) 

然而,它拋出的錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 4, in <module> 
ValueError: (None, 'world', None) is not in list 

我如何可以遍歷元組適當地與'None'字符串替換兩個None對象?

+0

元組是不可變的 - 我會建議使用不同的數據結構,如果你需要它是動態的。 – 2014-09-24 18:17:58

+2

這是因爲你有兩個None,一旦你遇到第一個None,你改變了我的值,但你仍然保存着這個舊的值。例如,它開始爲'(None,'world',None)',但當它變成'('None','world',None)時,當它改變時''但是你的i仍然保存着原始值,你用'.index'搜索它沒有找到。 – 2014-09-24 18:21:30

回答

1

第一None值後更改爲'None',j仍然是(None, 'world', None)。您正在更新x[n],但不是j。如果您直接通過x進行迭代,則您的代碼有效。

x = [('hello','there'),(None,'world',None)] 
for i in range(len(x)): 
    for j in x[i]: 
     if j is None: 
      n = i 
      l = list(x[n]) 
      m = x[n].index(j) 
      l[m] = 'None' 
      x[n] = tuple(l) 
+0

感謝@MackM對解決方案的解釋和想法 – Daniel 2014-09-24 18:45:29

2
>>> x = [('hello', 'there'),(None, 'world', None)] 
>>> [tuple('None' if item is None else item for item in tup) for tup in x] 
[('hello', 'there'), ('None', 'world', 'None')] 
2

你找到None當你第一次運行

x[n] = tuple(l) 

改變(None,'world',None)('None','world',None)。你會發現None第二次運行

x.index((None,'world',None)) 

但現在x是

x = [('hello','there'),('None','world',None)] 

所以它不包含(None,'world',None),產生你的值錯誤

+0

謝謝@pqnet這幫了很大的忙! – Daniel 2014-09-24 18:41:00