2017-04-11 158 views
-2

我試圖獲取某些數據中某些元素的索引。我想查找'b'和'c'的所有實例,並將它們的索引放在'position_b'和'position_c'中。這是我寫的代碼,我用得到的錯誤:Python AttributeError:'list'對象沒有屬性'startswith'

data = [['a', 'b', 'c'], ['a', 'a', 'a'], ['b', 'c', 'c'], ['d', 'b', 'f'], ['g', 'c', 'i']] 

position_b, position_c = [], [] 
for line in data: 
    if data.startswith("b"): 
    position_b.append(line.index("b")) 
    elif data.startswith("c"): 
    position_c.append(line.index("c")) 

在數據上面顯示,某些行不會有B或C,有的線路將同時擁有。

我最初嘗試'索引',但是這給了'substring not found'錯誤,因爲有些列表沒有'b'或'c'。然後,我從答案here嘗試'startswith',但是這給了我錯誤'AttributeError:'list'object has no attribute'startswith''我現在明白了startswith不能與列表對象一起工作。我可以用什麼來查找和索引列表中的'b'或'c'?

所需的輸出:

position_b = [1, 0, 1] 
position_c = [2, 1, 2, 1] 
+0

列表沒有startswith方法。請查閱文檔,以獲得像這樣的問題 – Carcigenicate

+3

請刪除所有不需要的代碼以重現代碼中的錯誤。 'line.split()'返回'['a','b','c'] ['d','b','f'] ['g','c','我'(那是什麼?一串?),請提供準確的信息。總之,提供一個[mcve](沒有'gzip','sys'和其他所有與您試圖解決的異常無關的問題)。 – MSeifert

+0

數據是字符串列表還是列表列表,例如:'data = [['a','b','c'],['a','a','a']]'? –

回答

0

您可以使用list comprehension來實現你的任務是這樣的方式:

我認爲data變量是像這樣一個列表的列表:

data = [['a', 'b', 'c'], ['a', 'a', 'a'], ['b', 'c', 'c'], ['d', 'b', 'f'], ['g', 'c', 'i']] 

所以,你可以這樣做:

position_b = [(k,i) for k,v in enumerate(data) for i,j in enumerate(v) if j == 'b'] 
position_c = [(k,i) for k,v in enumerate(data) for i,j in enumerate(v) if j == 'c'] 

print("position_b:", position_b) 
print("position_c:", position_c) 

輸出:

# position: 0, 1 
#    v v 
position_b: [(0, 1), (2, 0), (3, 1)] 
position_c: [(0, 2), (2, 1), (2, 2), (4, 1)] 

編輯

整個list comprehension語法可以這樣寫僅使用for loopsenumerate這樣:

position_b, position_c = [], [] 
for k,v in enumerate(data): 
    for i,j in enumerate(v): 
     if j == 'b': 
      position_b.append((k,i)) 
     if j == 'c': 
      position_c.append((k,i)) 

print(position_b) 
print(position_c) 

輸出:

[(0, 1), (2, 0), (3, 1)] 
[(0, 2), (2, 1), (2, 2), (4, 1)] 
+0

我有困難通過列表理解令人困惑,你可以分解一點,這樣我可以更好地瞭解發生了什麼?當我嘗試將它分解成塊時,我的「if j =='b'」行會出現'無效語法'。這工作雖然,感謝您的幫助! – Liquidity

+0

現在檢查,我已經更新了我的答案。 –

0

雖然您希望使用startswith,好像你只是想知道,如果列表包含某一個項目,無論其位置。所以你可以使用in關鍵字。

if "b" in data: 
    position_b.append(line.index("b")) 

或者:

try: 
    index = line.index("b") 
except ValueError: 
    # line doesn't contain "b" 
    pass 
else: 
    position_b.append(index) 

希望這有助於!

+0

如果我通過在開始處添加position_b = []嘗試第一個選項,並在最後打印position_b,則print語句只是給出空括號[],而不是我期待的[1,0,1]。第二個選項只給出列表中第一個「b」實例的索引,我希望它爲['b','b','b'等列表給出[0,1,2] ]。 – Liquidity

相關問題