Python:根据元素执行(子)列表

时间:2015-10-28 16:00:39

标签: python list sublist

[我开始使用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',' b'' c'),这些主机名有关联的A和TXT记录,并且在没有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']]

2 个答案:

答案 0 :(得分:1)

您可以尝试使用filter和lambda表达式。例如:

acceptable_elements = ['a','b']
filtered_list = filter(lambda sublist: (sublist[0] in acceptable_elements), my_list)

这将检查列表中的所有元素,并且不会更改原始列表。如果你想检查整个列表中是否存在元素,我无法从你的例子中准确地告诉你是想要检查第一个位置还是整个列表:

acceptable_elements = ['a','b']
filtered_list = filter(lambda sublist: any([c in acceptable_elements for c in sublist]), my_list)

答案 1 :(得分:1)

你可以这样做:

'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