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')]