如何全局声明此Python列表

时间:2014-03-15 16:48:46

标签: python

import concurrent.futures
import urllib.request
import json

myurls = {}
for x in range(1, 15):
    for y in range(1, 87):

        strvar1 = "%s" % (x)
        strvar2 = "%s" % (y)

        with open("C:\\Python33\\NASDAQ Stock Strings\\NASDAQ_Config_File_{}_{}.txt".format(x,y),"r") as f:
            myurls[x,y] = f.read().replace('\n', '')            
            print("myurls_" + str(strvar1) + "_" + str(strvar2) + "=", myurls[x,y])

            def myglob():
                global myurls


            URLS = [myurls2_1_1,myurls2_1_2,myurls2_1_3,myurls2_1_4,myurls2_1_5 ETC>>>ETC >>>]

下面的代码工作正常。这个想法是:

  1. 将多个源.txt文件中的多个字符串定义为字典。
  2. 同时将这些多个变量传递给URLS = []语句,以便可以使用用于python的concurrent.futures模块并行处理它们。

1 个答案:

答案 0 :(得分:1)

你说

def myglob():
    global myurls
     

语法明智,但我想要使用的变量列表,即myurls2_1_1myurls2_1_2等,会抛出一个错误,说明它们没有被定义。

这是对的。但是你非常接近:只需按照你定义的方式访问它们:myurls[1,1]或你如何定义它们。

以动态的方式定义变量几乎是不可能的。通常你可以通过任何dict键或列表索引访问来实现它。

正如您现在提供的一个例子,我可以准确地展示您的行为:

myurls = {}
for x in range(1, 15):
    for y in range(1, 87):

        strvar1 = "%s" % (x) # you can omit these.
        strvar2 = "%s" % (y)

        with open("C:\\Python33\\NASDAQ Stock Strings\\NASDAQ_Config_File_{}_{}.txt".format(x,y),"r") as f: # This is NOT the right place to put an application-specific config file.
            myurls[x,y] = f.read().replace('\n', '')            
            print("myurls[%d,%d] = %s" % (x, y, myurls[x,y]))

            def myglob(): # this function is completely pointless.
                global myurls

# Construct your urls list only after you have everything that belongs in it, i. e. on the correct indentation level:
urls = [myurls[1,1], myurls[1,2], myurls[1,3], myurls[1,4], ...]

这将是一种方法。它看起来非常复杂和怪异,这是最后一段很长的路线。

但你可以用列表理解来缩短它:

urls = [myurls[x,y] for x in range(1, 15) for y in range(1, 87)]

但是,你可能会被问到:"为什么不在途中建造呢?"

嗯,我们走了:

myurls = {}
urls = []
for x in range(1, 15):
    for y in range(1, 87):

        with open("C:\\Python33\\NASDAQ Stock Strings\\NASDAQ_Config_File_{}_{}.txt".format(x,y), "r") as f:
            thisfile = f.read().replace('\n', '')
            myurls[x,y] = thisfile
            urls.append(thisfile)
            print("myurls[%d,%d] = %s" % (x, y, thisfile))

你就是。

没有必要将它们全部放入列表中,因为这与并行化无关,而后者似乎只是稍后出现。

所有重要的是,您在并行化开始时出现urls。如果这种情况立即发生或逐项无关紧要。