我是一名大学生,也是蟒蛇的新手。假设我有关于我国家地铁系统的数据:
data -> (('NS1', 'Jurong East', 'North South Line'), ('NS7', 'Kranji',
'North South Line'), ('NS13', 'Yishun', 'North South Line'), ('EW5',
'Bedok', 'East West Line'), ('EW10', 'Kallang', 'East West Line'),
('EW15', 'Tanjong Pagar', 'East West Line'), ('NE5', 'Clarke Quay','North
East Line'), ('NE10', 'Potong Pasir', 'North East Line'),
('NE15','Buangkok', 'North East Line'))我想创建一个可以返回行的元组的函数parse_lines:
output -> (('North South Line',('NS1', 'Jurong East'), ('NS7', 'Kranji'),
('NS13', 'Yishun')), ('East West Line',('EW5','Bedok'),
('EW10','Kallang'), ('EW15', 'Tanjong Pagar')), ('North East
Line',('NE5', 'Clarke Quay'), ('NE10', 'Potong Pasir'),
('NE15','Buangkok')))这是我想出的代码,但它不起作用:
def parse_lines(data_file):
rows = data_file
lines = ()
curr_line_name = rows[0][2]
curr_line_stations = ()
for row in rows:
code, station_name, line_name = row
if line_name == curr_line_name:
curr_line_stations += (tuple(row[:2]),)
lines = (line_name,tuple(curr_line_stations))
else:
curr_line_name = line_name
return lines如果我能对我的代码提出一些建议,让它正常工作,我会非常感激。谢谢
发布于 2017-09-26 21:05:25
您可以将字典与Python3的解包一起使用:
from collections import defaultdict
d = defaultdict(list)
data = (('NS1', 'Jurong East', 'North South Line'), ('NS7', 'Kranji',
'North South Line'), ('NS13', 'Yishun', 'North South Line'), ('EW5',
'Bedok', 'East West Line'), ('EW10', 'Kallang', 'East West Line'),
('EW15', 'Tanjong Pagar', 'East West Line'), ('NE5', 'Clarke Quay','North East Line'), ('NE10', 'Potong Pasir', 'North East Line'),
('NE15','Buangkok', 'North East Line'))
for name, location, direction in data:
d[direction].append((name, location))
final_output = tuple(((a), *b) for a, b in d.items())输出:
(('North South Line', ('NS1', 'Jurong East'), ('NS7', 'Kranji'), ('NS13', 'Yishun')), ('North East Line', ('NE5', 'Clarke Quay'), ('NE10', 'Potong Pasir'), ('NE15', 'Buangkok')), ('East West Line', ('EW5', 'Bedok'), ('EW10', 'Kallang'), ('EW15', 'Tanjong Pagar')))发布于 2017-09-26 21:07:22
我认为对于您的问题,dict或defaultdict是更好的数据结构
>>> from collections import defaultdict
>>> lines = defaultdict(list)
>>> for row in data:
code, station, line = row
lines[line].append((code, station))
>>> lines
defaultdict(<type 'list'>, {'North South Line': [('NS1', 'Jurong East'), ('NS7', 'Kranji'), ('NS13', 'Yishun')],
'East West Line': [('EW5', 'Bedok'), ('EW10', 'Kallang'), ('EW15', 'Tanjong Pagar')],
'North East Line': [('NE5', 'Clarke Quay'), ('NE10', 'Potong Pasir'), ('NE15', 'Buangkok')]})如果你真的想要一个tuple-of-tuples,你可以这样做:
>>> tuple((line, stations) for line, stations in lines.items())
(('North South Line', [('NS1', 'Jurong East'), ('NS7', 'Kranji'), ('NS13', 'Yishun')]),
('East West Line', [('EW5', 'Bedok'), ('EW10', 'Kallang'), ('EW15', 'Tanjong Pagar')]),
('North East Line', [('NE5', 'Clarke Quay'), ('NE10', 'Potong Pasir'), ('NE15', 'Buangkok')]))发布于 2017-09-26 21:07:38
我使用list comperhension分两步完成: 1)从元组数据中提取行2)创建字典,为每一行获取元组的其余部分作为列表
如果需要,可以将其转换回元组。
lines = {tuple[2] for tuple in data}
out = {line: [(a,b) for a,b,c in data if c == line] for line in lines}结果:
{'North South Line': [('NS1', 'Jurong East'), ('NS7', 'Kranji'),
('NS13', 'Yishun')], 'East West Line': [('EW5', 'Bedok'), ('EW10',
'Kallang'), ('EW15', 'Tanjong Pagar')], 'North East Line': [('NE5',
'Clarke Quay'), ('NE10', 'Potong Pasir'), ('NE15', 'Buangkok')]}https://stackoverflow.com/questions/46427221
复制相似问题