<p>您可以在Python3中使用基于类的解决方案,并使用运算符重载来获得对数据的附加可访问性:</p>
<pre><code>import re
import itertools
class MealPlan:
def __init__(self, string, headers):
self.headers = headers
self.grouped_data = [d for c, d in [(a, list(b)) for a, b in itertools.groupby(string.split('\n'), key=lambda x:x in ['Starters', 'Mains'])]]
self.final_grouped_data = list(map(lambda x:[x[0][0], x[-1]], [grouped_data[i:i+2] for i in range(0, len(grouped_data), 2)]))
self.final_data = [[[a, *list(filter(None, re.split('\s(?=\d)', i)))] for i in b] for a, b in final_grouped_data]
self.final_data = [list(filter(lambda x:len(x) > 1, i)) for i in self.final_data]
def __getattr__(self, column):
if column not in self.headers:
raise KeyError("'{}' not found".format(column))
transposed = [dict(zip(self.headers, i)) for i in itertools.chain.from_iterable(self.final_data)]
yield from map(lambda x:x[column], transposed)
def __getitem__(self, row):
new_grouped_data = {a:dict(zip(self.headers[1:], zip(*[i[1:] for i in list(b)]))) for a, b in itertools.groupby(list(itertools.chain(*self.final_data)), key=lambda x:x[0])}
return new_grouped_data[row]
def __repr__(self):
return ' '.join(self.headers)+'\n'+'\n'.join('\n'.join(' '.join(c) for c in i) for i in self.final_data)
string='Starters\nSalad with Greens 14.00\nSalad Goat Cheese 12.75\nMains\nPizza 12.75\nPasta 12.75\n'
meal = MealPlan(string, ['Category', 'Dish', 'Price'])
print(meal)
print([i for i in meal.Category])
print(meal['Starters'])
</code></pre>
<p>输出:</p>
<pre><code>Category Dish Price
Starters Salad with Greens 14.00
Starters Salad Goat Cheese 12.75
Mains Pizza 12.75
Mains Pasta 12.75
['Starters', 'Starters', 'Mains', 'Mains']
{'Dish': ('Salad with Greens', 'Salad Goat Cheese'), 'Price': ('14.00', '12.75')}
</code></pre>