我正在搜索这样的列表:
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']
没有发生,但通常也许选择处理这种情况的解决方案是好的
答案 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']