2016-11-16 61 views
0

假設我有2所列出如何刪除此列表中的一個項目?

list1 = [['abc', '123'], ['def', '456']] 
list2 = ['abc','123','def','456','ghi','789'] 

如何從列表1中移除1元通過鍵入隻字母或數字

例如,如果我輸入「ABC」或「123」我希望它顯示

[['def', '456'], ['ghi', '789']] 

在list2中我可以使它通過下面的代碼

contact = input("Type the name/number of the contact you want to remove") 
if contact in list2: 
    pos = list2.index(contato) 
    if pos % 2 == 0: 
     list2.pop(pos) 
     list2.pop(pos) 
    if pos % 2 != 0: 
     list2.pop(pos-1) 
     list2.pop(pos-1) 
刪除對

但是我不能夠做,在列表1既是號碼和字母在一起,使我想唯一的辦法是轉移的新列表2至LIST1,但我不知道我該怎麼做

我知道我寫的是真的很混亂,但基本上我想改造

this: ['def','456','ghi','789'] into this: [['def', '456'], ['ghi', '789']] 

回答

2

我知道我寫的是真的很混亂,但基本上我想改造

this: ['def','456','ghi','789'] into this: [['def', '456'], ['ghi', '789']]

使用一個簡單的列表理解窩名單在每兩個元素:

>>> l = ['def','456','ghi','789'] 
>>> l = [[i, j] for i, j in zip(l[0::2], l[1::2])] 
>>> l 
[['def', '456'], ['ghi', '789']] 
>>> 

這樣做是它遍歷列表每隔兩個元素。但是,如果列表的長度相同,這種方法纔有效。這將打破:

>>> l = ['def','456','ghi','789', 'foo'] 
>>> l = [[i, j] for i, j in zip(l[0::2], l[1::2])] 
>>> l 
[['def', '456'], ['ghi', '789']] 
>>> 

的問題,在最短的迭代器內置的zip()停止。如果您需要將可能長度不均勻的列表分組,請使用itertools.zip_longest()。這將填補None到任何不匹配的值:

>>> from itertools import zip_longest # izip_longest for Python 2.x users 
>>> l = ['def','456','ghi','789', 'foo'] 
>>> l = [[i, j] for i, j in zip_longest(l[0::2], l[1::2])] 
>>> l 
[['def', '456'], ['ghi', '789'], ['foo', None]] 
>>> 
+0

用戶似乎是python的新手。也許你應該教他們關於元組。 – naomik

+0

啊!打我吧! – anshanno

+0

看起來他們想要'(姓名,電話)' – naomik

1

什麼:

contact = input("Type the name/number of the contact you want to remove") 
for i in range(len(list1)): 
    pair = list1[i] 
    if contact in pair: 
     list1.pop(pair) 

這個做什麼,是通過從0到len(list1)數字,這是在list1所有項目指標環。如果該索引中的項目包含鍵入的聯繫人,請從list1中彈出。

正如@葉的答案所示,你也可以使用列表理解來做到這一點。

contact = input("Type the name/number of the contact you want to remove") 
result = [pair for pair in list1 if contact not in pair] 

這和上面的代碼基本上是一樣的,但方式稍有不同。括號[ ... ]表示您正在創建一個新列表。這些括號之間的表達式指定了列表中的內容。

是去for pair in list1看起來很熟悉,右邊的部分?它基本上是一個for循環,循環遍歷list1中的元素,依次將每個項目分配給pair變量。

但是我們在這裏的表達略有不同,它以:pair for pair in list1開頭。第一個pair是一個表達式,用於指定要放入結果列表中的內容,用於循環的每次迭代。在這種情況下,我們只是將這一對直接放入結果列表中,但您可以在此修改它。比方說,你只是希望把每一對在結果列表中的第一個元素,那麼你會寫:

result = [pair[0] for pair in list1] 

那麼,什麼是半句呢? if contact not in pair部分指定只有不包含contact的對才應放入我們的新列表中。您可以在其中放置任何表達式,任何時候該表達式的計算結果爲True,該項目都將包含在結果中。

0

它看起來像你來自另一種語言的Python。我將爲您的最終數據推薦一個元組列表,但如果您更喜歡這樣,可以將其更改爲列表列表

我將從一個函數將您的平面列表轉換爲列表2元組元組,稱爲make_phonebook。然後,我們會做出filter_phonebook函數,它接受一個電話薄和輸入query,並返回一個新的電話簿,其中匹配的輸入查詢項被刪除

def make_phonebook(iterable): 
    z = iter(iterable) 
    return [(x,y) for x,y in zip(z,z)] 

def filter_phonebook(phonebook, query): 
    return [(name,phone) 
      for name,phone in phonebook 
      if name != query and phone != query] 

現在我們可以很方便地與數據合作

list2 = ['abc','123','def','456','ghi','789'] 
book = make_phonebook(list2) 

print(filter_phonebook(book, 'abc')) 
# [('def', '456'), ('ghi', '789')] 

print(filter_phonebook(book, '123')) 
# [('def', '456'), ('ghi', '789')] 

print(filter_phonebook(book, 'def')) 
# [('abc', '123'), ('ghi', '789')] 
相關問題