[英]How to perform search on a list of 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'),('car','rock','pig')]
有人可以幫我實現目標嗎?
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]]
假設的長度b
是3,下面的代碼將工作,即使a
包含'k','h','p'
,使得它們並不總是彼此跟隨正確,如:
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')]
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']
filtered = [ele for ele in a if ele[1] in b]
def split_list(_list, idx_range):
_t = []
_temp = []
_d = {idx + 1: ele for idx, ele in enumerate(_list)}
for k in _d:
if k % idx_range == 0:
_t.append(_d[k])
_temp.append(_t)
_t = []
else:
_t.append(_d[k])
return _temp
_nested = split_list(filtered, len(b))
_l1 = []
for outer in _nested:
_s = ''
for inner in outer:
_s += inner[1]
_l1.append(_s)
_l2 = [_nested[idx] for idx, ele in enumerate(_l1) if ''.join(b) == ele]
final = []
for ele in _l2:
tup = [e[0] for e in ele]
final.append(tuple(tup))
print final
輸出:
[('jamy', 'Park', 'kick'), ('car', 'rock', 'pig')]
鑒於:
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
的序列相同,則可以執行以下操作:
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')]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.