文件中每行下面的行数总和

2024-04-20 08:34:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的意见

A  100
B  150
C  200
D  250
E  300

我想要的输出是上面所有元素的总和:类似于

   A to A - 100
   A to B - 250
   A to C - 450
   A to D - 700
   A to E - 1000
   B to B - 150
   B to C - 350
   B to D - 600
   B to E - 900
   C to C - 200
   C to D - 450
   C to E - 650
   D to D - 250
   D to E - 550
   E to E - 300

文件大小约为250MB。我写了一个python程序,它首先将每个行存储在字典中。但我认为,大规模投入是不可行的。我是linux的初学者。你知道吗


Tags: to程序元素字典linux意见初学者总和
3条回答

只需存储值和嵌套循环:

awk '
    { label[NR]=$1; val[NR]=$2 } 
    END {
        for (i=1; i<=NR; i++) {
            sum = 0
            for (j=i; j<=NR; j++) {
                sum += val[j]
                print label[i] " to " label[j] " - " sum
            }
        }
    }
' file

我认为对于大文件(您必须将整个文件存储在内存中,并且执行嵌套循环的操作是O(N^2)(或者是O(NlogN),已经有一段时间了……)操作,这样做仍然很慢。我怀疑把数据扔进数据库会帮到你。你知道吗

所以你的输入文件大约是250MB。我们称之为250MB,即262144000字节。您的代表性输入是每行7个字节—一个字符、两个空格、一个三位数和一个换行符。这意味着有37449142行。你知道吗

如果您的意图是最终为输入文件中的每一对可能的行生成一个输出,那么您需要准备存储37449142*37449143/2=701219136992653单独的输出行。代表性的是每个字节7个字节,忽略了大多数字节最终可能会更大的事实,即4908533958948571字节,即需要存储的4464 TB数据。你知道吗

希望您的预算有足够的资金来购买一些大型EMC阵列。否则,正如你所怀疑的,这可能有点不可行。。。你知道吗

使用python:

>>> value =[]
>>> name = []
>>> f=open('yourfile.txt')
>>> for x in f:
...     x=x.strip()
...     na,va = x.split()
...     name.append(na)
...     value.append(va)
... 
>>> name
['A', 'B', 'C', 'D', 'E']
>>> value
['100', '150', '200', '250', '300']
>>> for i in range(len(name)):
...     for j in range(i,len(name)):
...         print name[i],name[j],str(sum(map(int,value[i:j+1])))
... 

输出:

A A 100
A B 250
A C 450
A D 700
A E 1000
B B 150
B C 350
B D 600
B E 900
C C 200
C D 450
C E 750
D D 250
D E 550
E E 300

相关问题 更多 >