<p>使用Python groupby和Python<a href="https://docs.python.org/3/library/itertools.html" rel="nofollow noreferrer">itertools module</a>中的产品</p>
<p><strong>代码</strong></p>
<pre><code>from itertools import groupby, product
def all_paths(s):
# Convert string to list of node triplets
nodes = [n.strip().split() for n in s.split('\n')]
# Skip header and sort by time
# (since time is padded, no need to convert to datetime object to sort)
nodes = sorted(nodes[1:], key=lambda n: n[1]) # sorting by time which is second item in list (n[1])
# Group nodes by time (i.e. list of list, with nodes with same time in same sublist)
# Just keeping the node field of each item in sublist (i.e. node[0] is Node field)
labels = [[node[0] for node in v] for k, v in groupby(nodes, lambda n:n[1])]
# Path is the product of the labels (list of lists)
return list(product(*labels))
</code></pre>
<p><strong>用法</strong></p>
<p>示例1:字符串中的数据</p>
<pre><code>data = '''Node Date Data
A 2020-01-01 2.09
B 2020-01-05 0.89
C 2020-01-08 3.17
D 2020-01-08 1.15
E 2020-01-15 3.65'''
print(all_paths(data))
</code></pre>
<p>示例2:文件Data.txt中的数据</p>
<pre><code>with open('data.txt', 'r') as fin:
print(all_paths(fin.read()))
</code></pre>
<p>输出(两种情况下):</p>
<pre><code>[('A', 'B', 'C', 'E'), ('A', 'B', 'D', 'E')]
</code></pre>