访问列表元素不等于特定值

时间:2017-08-08 06:57:29

标签: python

我正在搜索这样的列表:

my_list = [['a','b'],['b','c'],['a','x'],['f','r']]

我希望看到'a'附带哪些元素。首先,我必须找到'a'出现的列表。然后访问列表的其他元素。我是通过abs(pair.index('a')-1)

执行的
for pair in my_list:
    if 'a' in pair:
       print( pair[abs(pair.index('a')-1)] )

有没有更好的pythonic方法呢? 有点像:pair.index(not 'a')可能吗?

更新:

  • 也许最好指出'a'不一定是第一个元素。

  • 在我的情况下,['a','a']没有发生,但通常也许选择处理这种情况的解决方案是好的

3 个答案:

答案 0 :(得分:5)

您在寻找伴随a的元素吗?如果是这样,一个简单的列表理解将会:

In [110]: [x for x in my_list if 'a' in x]
Out[110]: [['a', 'b'], ['a', 'x']]

如果您只想要元素而不是对,那么在打印之前如何摆脱a

In [112]: [(set(x) - {'a'}).pop() for x in my_list if 'a' in x]
Out[112]: ['b', 'x']

我使用set因为a可能是该对中的第一个第二个元素。

答案 1 :(得分:0)

如果我正确理解您的问题,以下内容应该有效:

my_list = filter(
   lambda e: 'a' not in e,
   my_list
)

请注意,在python 3中,这将返回一个过滤器对象实例。您可能希望将代码包装在list()命令中以获取列表实例。

答案 2 :(得分:0)

这种技术在这里工作正常,但使用集合可能会更高效,也更有可读性。这是实现这一目标的一种方法。

def paired_with(seq, ch):
    chset = set(ch) 
    return [(set(pair) - chset).pop() for pair in seq if ch in pair]

my_list = [['a','b'], ['b','c'], ['x','a'], ['f','r']]

print(paired_with(my_list, 'a'))

<强>输出

['b', 'x']

如果你想在同一个列表上做很多测试,那么建立一个集合列表会更有效。

def paired_with(seq, ch):
    chset = set(ch) 
    return [(pair - chset).pop() for pair in seq if ch in pair]

my_list = [['a','b'], ['b','c'], ['x','a'], ['f','r']]
my_sets = [set(u) for u in my_list]
print(my_sets)
print(paired_with(my_sets, 'a'))

<强>输出

[{'b', 'a'}, {'c', 'b'}, {'x', 'a'}, {'r', 'f'}]
['b', 'x']

如果有['a', 'a']这样的对,则会失败,但我们可以轻松解决这个问题:

def paired_with(seq, ch):
    chset = set(ch) 
    return [(pair - chset or chset).pop() for pair in seq if ch in pair]

my_list = [['a','b'], ['b','c'], ['x','a'], ['f','r'], ['a', 'a']]
my_sets = [set(u) for u in my_list]
print(paired_with(my_sets, 'a'))

<强>输出

['b', 'x', 'a']