python-将巨大的列表拆分为多个列表;在每一个上面循环

python-将巨大的列表拆分为多个列表;在每一个上面循环,python,loops,subset,Python,Loops,Subset,在提到我的问题时,我意识到语料库太大了,在进行levenshtein计算之前,需要将其分成多个小列表。下面的代码是我的简单尝试,但我想知道是否有更优雅的方法来实现它: import csv#, StringIO import itertools, Levenshtein # open the newline-separated list of words path = '/Users/path/' file = path + 'wordlist.txt' output1 = path + 'o

在提到我的问题时,我意识到语料库太大了,在进行levenshtein计算之前,需要将其分成多个小列表。下面的代码是我的简单尝试,但我想知道是否有更优雅的方法来实现它:

import csv#, StringIO
import itertools, Levenshtein

# open the newline-separated list of words
path = '/Users/path/'
file = path + 'wordlist.txt'
output1 = path + 'ortho1.csv'
output2 = path + 'ortho2.csv'
output3 = path + 'ortho3.csv'
output4 = path + 'ortho4.csv'
output5 = path + 'ortho5.csv'
output6 = path + 'ortho6.csv'

words = sorted(set(s.strip() for s in open(file)))

# words is a list with 16349, so I split it in to 6 mini lists
verbs1 = words[:3269]
verbs2 = words[3269:13080]
verbs3 = words[13081:9811]
verbs4 = words[9812:6542]
verbs5 = words[6543:3273]
verbs6 = words[3274:len(words)]
对于上面的每个列表,我然后计算以下循环:

with open(output1, 'wb') as f:  
   writer = csv.writer(f, delimiter=",", lineterminator="\n")   
   for a, b in itertools.product(verbs1, words):        
       if (a < b and Levenshtein.distance(a,b) <= 5):
                    writer.writerow([a, b, Levenshtein.distance(a,b)])
以open(output1,'wb')作为f的
:
writer=csv.writer(f,delimiter=“,”,lineterminator=“\n”)
对于itertools.product中的a、b(逐字):

如果(a
verbs = [words[:3269],words[3269:13080],words[13081:9811],words[9812:6542],
         words[6543:3273],words[3274:len(words)]]
然后使用该列表的长度创建具有相同长度的循环。通过使用索引,我们可以创建路径并访问谓词中的正确元素

for i in range(len(verbs)):
    output = '{}ortho{}.csv'.format(path,i+1)
    with open(output, 'wb') as f:  
        writer = csv.writer(f, delimiter=",", lineterminator="\n")   
        for a, b in itertools.product(verbs[i], words):        
            if (a < b and Levenshtein.distance(a,b) <= 5):
               writer.writerow([a, b, Levenshtein.distance(a,b)])
范围内的i(len(动词)):
输出=“{}正交{}.csv”。格式(路径,i+1)
将open(输出“wb”)作为f:
writer=csv.writer(f,delimiter=“,”,lineterminator=“\n”)
对于itertools.product中的a、b(动词[i],单词):

如果(a
verbs = [words[:3269],words[3269:13080],words[13081:9811],words[9812:6542],
         words[6543:3273],words[3274:len(words)]]
然后使用该列表的长度创建具有相同长度的循环。通过使用索引,我们可以创建路径并访问谓词中的正确元素

for i in range(len(verbs)):
    output = '{}ortho{}.csv'.format(path,i+1)
    with open(output, 'wb') as f:  
        writer = csv.writer(f, delimiter=",", lineterminator="\n")   
        for a, b in itertools.product(verbs[i], words):        
            if (a < b and Levenshtein.distance(a,b) <= 5):
               writer.writerow([a, b, Levenshtein.distance(a,b)])
范围内的i(len(动词)):
输出=“{}正交{}.csv”。格式(路径,i+1)
将open(输出“wb”)作为f:
writer=csv.writer(f,delimiter=“,”,lineterminator=“\n”)
对于itertools.product中的a、b(动词[i],单词):

如果(a
  • 不要为
    动词
    输出
    各使用六个不同的变量,而是使用两个列表;这样,您可以更轻松地调整“拆分点”或子列表的数量,并且您不必复制粘贴代码块来比较六次单词;只需使用另一个循环即可

  • 子列表
    words[13081:9811]
    为空,第二个索引小于第一个索引的任何其他索引也是空的
  • 对于
    verbs1=words[:3269]
    verbs2=words[3269:13080]
    words[3269]
    将不在两个子列表中,因为第二个索引是独占的;以下列表也是如此
  • 万一这是您的意图,拆分列表不会减少复杂性或运行时间,因为您仍然需要比较每个单词;
    a*x+b*x+c*x
    (a+b+c)*x
  • 不要选中
    a
    并放弃一半的
    产品
    ,而是使用(但这仅在不拆分列表时有效)

  • 如果您只对编辑距离为
    的配对感兴趣,那么您的代码存在一些问题,您还可以改进其他方面:

    • 不要为
      动词
      输出
      各使用六个不同的变量,而是使用两个列表;这样,您可以更轻松地调整“拆分点”或子列表的数量,并且您不必复制粘贴代码块来比较六次单词;只需使用另一个循环即可

    • 子列表
      words[13081:9811]
      为空,第二个索引小于第一个索引的任何其他索引也是空的
    • 对于
      verbs1=words[:3269]
      verbs2=words[3269:13080]
      words[3269]
      将不在两个子列表中,因为第二个索引是独占的;以下列表也是如此
    • 万一这是您的意图,拆分列表不会减少复杂性或运行时间,因为您仍然需要比较每个单词;
      a*x+b*x+c*x
      (a+b+c)*x
    • 不要选中
      a
      并放弃一半的
      产品
      ,而是使用(但这仅在不拆分列表时有效)

    • 如果您只对编辑距离为单词[13081:9811]的配对感兴趣,您尝试过这个吗?这不是一个空列表,因为“to”索引低于“from”索引?此外,你可能应该使用列表,而不是6个单独的变量。你可以将动词拆分成一个列表字典,你的第一个代码部分是funcy,其余的都可以。此外,如果你为所有变量都做产品,我看不出拆分列表对你有什么帮助。
      a*x+b*x+c*x
      (a+b+c)是一样的*x
      @tobias_k:你说得对!我把索引搞砸了。我的问题不太清楚-excel无法打开一个文件,所以我尝试将一个csv拆分为多个csv。但我似乎根本没有成功-有什么提示吗?如果你只对距离级别感兴趣,当然可以进行很多优化<代码>单词[13081:9811]
    您尝试过这个吗?这不是一个空列表吗,因为“to”索引低于“from”索引?此外,你可能应该使用列表,而不是6个单独的变量。你可以将动词拆分成一个列表字典,你的第一个代码部分是funcy,其余的都可以。此外,如果你为所有变量都做产品,我看不出拆分列表对你有什么帮助。
    a*x+b*x+c*x
    (a+b+c)是一样的*x
    @tobias_k:你说得对!我把索引搞砸了。我的问题不太清楚-excel无法打开一个文件,所以我试图将一个csv拆分为多个csv。但我似乎根本没有成功-有什么提示吗?如果你只对Y的级别感兴趣,你当然可以做很多优化我们的“然后”部分是错误的。这将把相同的结果写入每个输出文件。你还必须制作一个
    动词
    列表,并在循环中使用它。是的,这就是我刚刚意识到的。但是如下所示,还有其他问题需要处理。但是这回答了一个问题:我如何循环这个。你的“然后”部分是错误的。这将写入