假设我有2个列表
list1 = [['abc', '123'], ['def', '456']]
list2 = ['abc','123','def','456','ghi','789']
如何只输入字母或数字
,从list1中删除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)
但是我无法在list1中执行此操作,因为数字和字母都在一起,所以我想唯一的方法是将新的list2转移到list1但是我不确定我会怎么做< / p>
我知道我写的内容真的令人困惑,但基本上我想转换
this: ['def','456','ghi','789'] into this: [['def', '456'], ['ghi', '789']]
答案 0 :(得分: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]]
>>>
答案 1 :(得分: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
弹出。
正如@ leaf的回答所示,你也可以使用列表理解来做到这一点。
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
,该项就会包含在结果中。
答案 2 :(得分:0)
好像你从另一种语言来到python。我将为您的最终数据推荐一个元组列表,但如果您更喜欢,可以将其更改为列表列表
我将从一个将您的平面列表转换为一个名为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')]