pythonically地从文件中读取时一次构建2个列表

Nic*_*sky 11 python list python-3.x

我正在阅读一个包含数十万个代表图表边缘的数字对的大文件.我想建立2个列表:一个带有前沿,另一个带有反向.

目前我正在做一个显式for循环,因为我需要对我读过的行进行一些预处理.但是,我想知道是否有更多的pythonic方法来构建这些列表,如列表推导等.

但是,由于我有两个列表,我没有看到一种方法来使用理解来填充它们而不读取文件两次.

我的代码现在是:

with open('SCC.txt') as data:
    for line in data:
        line = line.rstrip()
        if line:
            edge_list.append((int(line.rstrip().split()[0]), int(line.rstrip().split()[1])))
            reversed_edge_list.append((int(line.rstrip().split()[1]), int(line.rstrip().split()[0])))
Run Code Online (Sandbox Code Playgroud)

Pad*_*ham 11

我会保持你的逻辑,因为它是Pythonic方法,而不是多次拆分/ rstrip相同的行:

with open('SCC.txt') as data:
    for line in data:
        spl = line.split()
        if spl:
            i, j = map(int, spl)
            edge_list.append((i, j))
            reversed_edge_list.append((j, i))
Run Code Online (Sandbox Code Playgroud)

当你已经调用它时调用rstrip本身是多余的,所以当你分裂时,因为它已经删除了空白,所以只拆分一次意味着你节省了大量不必要的工作.

一旦有一个空格分隔,您还可以使用csv.reader读取数据并过滤空行:

from csv import reader

with open('SCC.txt') as data:
    edge_list, reversed_edge_list = [], []
    for i, j in filter(None, reader(data, delimiter=" ")):
        i, j = int(i), int(j)
        edge_list.append((i, j))
        reversed_edge_list.append((j, i))
Run Code Online (Sandbox Code Playgroud)

或者,如果有多个空格分隔,您可以使用map(str.split, data):

    for i, j in filter(None, map(str.split, data)):
        i, j = int(i), int(j)
Run Code Online (Sandbox Code Playgroud)

无论你选择什么,都会比过两次数据或多次分割同一行更快.


Jim*_*ard 5

不能在一个理解中创建两个列表,因此,不是在两个列表上执行两次相同的操作,一个可行的选项是初始化其中一个,然后通过反转第一个中的每个条目来创建第二个.这样你就不会两次迭代文件.

为此,您可以创建第一个edge_list具有理解力的列表(不确定为什么rsplit 再次调用它):

edge_list = [tuple(map(int, line.split())) for line in data]
Run Code Online (Sandbox Code Playgroud)

现在浏览每个条目并将[::-1]其反转以创建其反向兄弟reverse_edge_list.

使用模拟数据edge_list:

edge_list = [(1, 2), (3, 4), (5, 6)]
Run Code Online (Sandbox Code Playgroud)

扭转它可能看起来像这样:

reverse_edge_list = [t[::-1] for t in edge_list]
Run Code Online (Sandbox Code Playgroud)

现在看起来像:

reverse_edge_list
[(2, 1), (4, 3), (6, 5)]
Run Code Online (Sandbox Code Playgroud)