Python 如何在元组列表上执行搜索
我有一个元组列表。例如,我有以下几点:Python 如何在元组列表上执行搜索,python,list,search,find,tuples,Python,List,Search,Find,Tuples,我有一个元组列表。例如,我有以下几点: a=[('jamy', 'k'), ('Park', 'h'), ('kick', 'p'), ('an', 'o'),('an', 'o'),('an', 'o'),('an', 'r'), ('car', 'k'), ('rock', 'h'), ('pig', 'p')] 还有一张名单 b = ['k','h','p'] 我想从列表a的第二个元组元素中找到列表b中的模式 在上面的示例中,输出应该返回 [('jamy','Park','kick')
a=[('jamy', 'k'), ('Park', 'h'), ('kick', 'p'), ('an', 'o'),('an',
'o'),('an', 'o'),('an', 'r'), ('car', 'k'), ('rock', 'h'), ('pig',
'p')]
还有一张名单
b = ['k','h','p']
我想从列表a的第二个元组元素中找到列表b中的模式
在上面的示例中,输出应该返回
[('jamy','Park','kick'),('car','rock','pig')]
有人能帮我实现我的目标吗?假设
b
的长度为3,即使a
包含'k'、'h'、'p'
这样它们并不总是正确地相互跟随,以下代码也可以工作,如中所示:
c = [(a[x][0], a[x+1][0], a[x+2][0])
for x, _ in enumerate(a)
if a[x][1] == b[0] and
a[x+1][1] == b[1] and
a[x+2][1] == b[2]]
a=[('test', 'k'), ('jamy', 'k'), ('Park', 'h'), ('kick', 'p'), ('car', 'k'),
('an', 'r'),('rock', 'h'), ('see','k'), ('it','h'),('an', 'o'),('works', 'p')]
b = ['k','h','p']
将产生:
[('jamy', 'Park', 'kick'), ('see', 'it', 'works')]
代码:
letters_a = "".join(str(tup[1]) for tup in a)
letters_b = "".join(str(letter) for letter in b)
regex = re.compile(r'(%s)[^%s]*(%s)[^%s]*(%s)'
% (letters_b[0],letters_b[:2],letters_b[1],letters_b,letters_b[2]))
#for this example, the above line translates to:
#regex = re.compile(r'(k)[^kh]*(h)[^khp]*(p)')
match = re.finditer(regex, letters_a)
results=[]
for m in match:
first,second,third = m.start(1), m.start(2), m.start(3)
results.append((a[first][0],a[second][0],a[third][0]))
print results
试试这个片段
list_of_values = [
('jamy', 'k'), ('Park', 'h'), ('kick', 'p'), ('an', 'o'), ('an', 'o'),
('an', 'o'), ('an', 'r'), ('car', 'k'), ('rock', 'h'), ('pig', 'p')
]
pattern = ('k','h','p')
# Important part
matches = [
values for values, keys in (
zip(*list_of_values[i:i + len(pattern)])
for i in range(len(list_of_values) - len(pattern) + 1)
) if keys == pattern
]
print(matches)
>> [('jamy', 'Park', 'kick'), ('car', 'rock', 'pig')]
输出:
[('jamy', 'Park', 'kick'), ('car', 'rock', 'pig')]
鉴于:
如果您的目标是根据与b
中的序列相同的顺序出现的第二个元素,从列表a
中收集元组组,则可以执行以下操作:
result=[]
for sl in [a[i:i+len(b)] for i in range(0,len(a))]:
if tuple([tp[1] for tp in sl])==b:
result.append(tuple(tp[0] for tp in sl))
print result
# [('jamy', 'Park', 'kick'), ('car', 'rock', 'pig')]
到目前为止你有什么?如果列表是
a=[('jamy','k'),('Park','h'),('kick','p'),('an','o'),('an','o'),('an','r'),('rock','h'),('pig','p')]
去掉了“car”元组。输出应该是[('jamy','Park','kick'),('jamy','rock','pig')]
还是[('jamy','Park','kick')]
不确定这是否是一个要求,但即使'k','h','p'
在a
中不是连续的,我的代码仍然有效。如果a
中成对的字母是:khhprgskrfbhevp
,它将与khhprgskrfbhevp
中的khp
匹配,大写字母表示匹配的字母。@Vysa欢迎使用堆栈溢出,当您认为您的问题已得到回答时,您应该通过单击该答案的“向上投票”和“向下投票”箭头下的“V”图标来选择一个接受的答案。@oleg谢谢,这是一个快速的答案。也许op应该告诉我们b是否有可变长度,或者它应该引用a[x][0],这在所有情况下都不会遵循这种模式!检查列表中的值=[(“公园”、“h”)、(“杰米”、“k”)、(“踢”、“p”)]
,这些值将产生[(“杰米”、“公园”、“踢”)]
,即使它们的顺序不正确。@OdraEncoded:你是在发明这个要求。没有说明模式列表或元组列表的顺序是否应该决定输出的顺序。有了模式=('k'、'h'、'p')
和列表中的值=[(“公园”、“h”)、(“杰米”、“k”)、(“踢”、“p”)]
我觉得[(“杰米”、“公园”、“踢”)的输出是正确的。它们都是“模式”。('k','h','p')
的顺序决定了输出的顺序或元组中字母的顺序。为什么说列表模式的顺序不应该是输出的顺序?我没有说,我说的顺序值应该与模式的顺序匹配,因为它是一种模式。在语义方面,你似乎比我更有经验,因此我将让你理解“模式”的正确含义,但问题明确指出用户希望“找到模式”,如果他们想找到它,那么模式是指搜索算法而不是输出结构。@drewk这是因为没有与模式匹配的顺序值。用户没有指定模式键之间是否允许使用随机键,但他指定了这是一种模式。
a = [
('jamy', 'k'), ('Park', 'h'), ('kick', 'p'), ('an', 'o'), ('an', 'o'),
('an', 'o'), ('an', 'r'), ('car', 'k'), ('rock', 'h'), ('pig', 'p')
]
b = ('k','h','p')
result=[]
for sl in [a[i:i+len(b)] for i in range(0,len(a))]:
if tuple([tp[1] for tp in sl])==b:
result.append(tuple(tp[0] for tp in sl))
print result
# [('jamy', 'Park', 'kick'), ('car', 'rock', 'pig')]