Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析行以返回元组python_Python_Tuples - Fatal编程技术网

解析行以返回元组python

解析行以返回元组python,python,tuples,Python,Tuples,我是一名大学生,也是python的新手。假设我有关于我国地铁系统的数据: 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 We

我是一名大学生,也是python的新手。假设我有关于我国地铁系统的数据:

    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

我真的很感激能给我的代码提些建议,让它工作起来。谢谢

您可以使用字典和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')))

您可以将字典与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')))

我认为
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')]})

我认为
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')]})

我使用list ComperExtension分两步完成此操作: 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')]}

我使用list ComperExtension分两步完成此操作: 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')]}

你能描述一下你看到的问题吗?除了它不起作用之外?您看到的是什么输出或错误消息?将为您解决此问题的操作称为
groupby
。您需要进行一些转换,但那里的代码可能会让您了解如何解决问题。可能的重复您能否描述您看到的问题,而不仅仅是它不起作用?您看到的是什么输出或错误消息?将为您解决此问题的操作称为
groupby
。您需要进行一些转换,但那里的代码可能会让您了解如何解决此问题。可能重复的