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)
无论你选择什么,都会比过两次数据或多次分割同一行更快.
你不能在一个理解中创建两个列表,因此,不是在两个列表上执行两次相同的操作,一个可行的选项是初始化其中一个,然后通过反转第一个中的每个条目来创建第二个.这样你就不会两次迭代文件.
为此,您可以创建第一个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)
归档时间: |
|
查看次数: |
616 次 |
最近记录: |