问题描述
我正在字符串元素列表中搜索模式。
目前我的代码运行良好,但有些数据无法产生所需的结果。
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
解决方法
使用 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()