簡體   English   中英

如何在元組列表上執行搜索

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM