[我从python开始;很抱歉,以下内容是愚蠢的,但我整天都缠着头,感到自己无法解决这个问题。]
我有一个类似的清单:
list = [['a', 'A', '10.0.0.2'], ['a', 'TXT', '1'], ['a', 'TXT', '2'], ['b', 'A', '10.10.10.10'], ['c', 'A', '10.0.0.3'], ['c', 'TXT', '3'], ['c', 'TXT', '4']]
本示例显示了具有七个子列表的列表,但可能有n个。
我想要实现的目标:每个唯一的
list[i][0]
(在这种情况下为'a','b','c')在相应的子列表中都应具有“ A”和“ TXT”,因此在此示例中,请保留所有list[i][0] == 'a'
和list[i][0] == 'c'
,删除所有出现的list[i][0] == 'b'
。我已经尝试了各种方法来完成此操作,但是实际上没有任何显示,因为我缺少一个想法,如何做到这一点。
我所做的:
获取唯一的
list[i][0]
:names = [list[i][0] for i in range(len(list))]
names_unique = list(set(names))
但是然后...如何进行?我猜想像
for ... in ...
这样的东西应该可以解决吗?有人能对此有所启示吗?将不胜感激!编辑1:很抱歉,不清楚:“ a”,“ b”和“ c”只是任意值。我事先不知道这些,它是dns区域传输的输出。我想保留所有具有关联的A和TXT记录的主机名(此处为“ a”,“ b”,“ c”),并删除不带TXT的主机名。我无法对诸如“ a”,“ b”或“ c”之类的任何名称进行硬编码,因为它们会发生变化;相反,我正在尝试拿出与我在此描述的功能相同的代码。
所需的输出:
list = [['a', 'A', '10.0.0.2'], ['a', 'TXT', '1'], ['a', 'TXT', '2'], ['c', 'A', '10.0.0.3'], ['c', 'TXT', '3'], ['c', 'TXT', '4']]
最佳答案
您可以这样做:
'define a function that checks if a key is valid or not'
def isValid(key, l):
return all(_ in (x[1] for x in filter(lambda x:x[0] == key,l)) for _ in ['TXT','A'])
keys = list(set(x[0] for x in l))
keysValid = []
for key in keys:
if isValid(key, l): keysValid.append(key)
filtered_list = list(filter(lambda x: x[0] in keysValid, l))
所有这些操作就是获取所有可能的密钥,然后将所有有效密钥添加到新列表中。然后,它在原始列表上使用
filter
来检查密钥是否在有效密钥列表中。这是一个丑陋的衬垫,您也可以使用:
>>> l = [['a', 'A', '10.0.0.2'], ['a', 'TXT', '1'], ['a', 'TXT', '2'], ['b', 'A', '10.10.10.10'], ['c', 'A', '10.0.0.3'], ['c', 'TXT', '3'], ['c', 'TXT', '4']]
>>> #this monstrosity right here
>>> u = list(filter(lambda x: x[0] in filter(lambda key: all(_ in (x[1] for x in filter(lambda x:x[0] == key,l)) for _ in ['TXT','A']),set(li[0] for li in l)),l))
>>> u
[['a', 'A', '10.0.0.2'], ['a', 'TXT', '1'], ['a', 'TXT', '2'], ['c', 'A', '10.0.0.3'], ['c', 'TXT', '3'], ['c', 'TXT', '4']]
重要说明:这与您的原始问题无关,但请勿将
list
用作变量名。这将禁止对python的列表函数list()
进行任何调用,这在使用filter()/set()
时非常有用,因为它们返回的是filter/set objects
而不是list
。关于python - Python:根据元素作用于(子)列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33395882/