Python 在字符串元素列表中搜索模式

时间:2021-02-26 06:14:24

标签: python-3.x pandas list pattern-matching string-matching

我正在字符串元素列表中搜索模式。

目前我的代码运行良好,但有些数据无法产生所需的结果。

代码

ss = '''
X   A
B   A
A   C
A   D
E   A
A   F
'''.strip()

lst = []
for r in ss.split('\n'):
    lst.append(r.split())

paths = []
for e in lst:
    # each row in source data
    pnew = []  # new path
    for p in paths:
        if e[0] in p:  # if start in existing path
            if p.index(e[0]) == len(p)-1:  # if end of path
                p.append(e[1])  # add to path
            else:
                pnew.append(p[:p.index(e[0])+1]+[e[1]])  # copy path then add
            break
    else:  # loop completed, not found
        paths.append(list(e)) # create new path
    if len(pnew):  # copied path
        paths.extend(pnew) # add copied path

print('\n'.join([' -> '.join(e) for e in paths]))

我得到的是

X -> A -> C
B -> A
X -> A -> D
E -> A
X -> A -> F

我要求的结果是什么

B -> A -> C
X -> A -> D
E -> A -> F
X -> A -> C
B -> A -> D
B -> A -> F
X -> A- > F

基于 Cr & Dr 我正在尝试获取模式(Cr & Dr 是可选的)

X   A   Cr
B   A   Cr
A   C   Dr
A   D   Dr
E   A   Cr
A   F   Dr

1 个答案:

答案 0 :(得分:0)

使用 pandas 更容易处理:

import pandas as pd
from io import StringIO

ss = '''
X A
B A
A C
A D
E A
A F
'''.strip()

df = pd.read_csv(StringIO(ss), sep=' ', names=['source', 'target'])
df = df.merge(df, how='inner', left_on='target', right_on='source')
df = df[['source_x', 'target_x', 'target_y']]
df.apply(lambda x: ' -> '.join(x), axis=1).sort_values()
相关问题