繁体   English   中英

匹配后追加到列表

[英]Appending to List after Matching

在继承某人的工作后,我遇到了一个相当随机的问题。

当前有2个CSV文件导入到python程序1中,其中包含数字1,其中包含模式和站点代码

当前,他的程序将正确导入CSV并检查“数字中是否包含模式”,如果是,它将打印与它匹配的模式中的数字,然后打印站点代码。

问题实际上是他想将每个匹配项附加到以他也静态创建的站点代码命名的列表。

经过大量的搜寻之后,似乎可以选择globals()来获得所需的行为

即:

x = Range[0]
globals()[x].append(DDI)

其中Range [0]是站点代码

我似乎遇到的问题是,尽管比较行在打印时工作正常,但所有数组的结果都相同

上下文的完整代码:

with open('NumPlan.csv', 'r') as f:
    mylist = []
    AEDUB = ATVIE = ATVZR = BEANT = BEBRS = BEBRU = BEMPL = CHBAS = CHLAS = CHZUR = CHWRO = CZOPA = CZPPA = DEBER = DEBSS = DEBRS = DECOL = DEDUS = DEESS = DEFBA = DEFFM = DEFRA = DEHAM = DEMUN = DENUR = DESTU = DKAAR = DKALB = DKCOP = ESBCN = ESMAD = ESMDD = ESPAL = ESVAL = FIHEL = FRBAG = FRBOR = FRLIL = FRLYN = FRMAR = FRMON = FRPRO = FRRHB = FRTOU = GBABE = GBAZT = GBBEL = GBBIR = GBBRI = GBCOL = GBEDI = GBGPH = GBGSH = GBLBS = GBLEE = GBLIV = GBLHH = GBLON = GBLWR = GBMAN = GBNOR = GBPAR = GBSMC = GBSOU = GBTRA = GBTHE = GBXWH = HUBUD = HUGUB = IEDBL = ITMIL = ITMOD = ITMVP = ITROM = ITTUR = ITMIG = LULGI = LULUX = NLAMS = NLUTR = NLDEN = NLRIK = NLROT = NLSCH = NODRO = PLWRO = PLART = PLWAA = PLWKS = PTLIS = ROBUC = RUMOS = SKBRA = SKZAM = SESTG = SESTO = SESOL = TRIST = []
    with open('Ranges.csv', 'r') as R:

     currentDDI = []
     ranges = []
     for line in f:
         li = line.split(",")
         for each in li:
             if "\\" in each:
                 currentDDI.append(each.strip())

     for line2 in R:
         Range = line2.split(",")

         for DDI in currentDDI:
             if Range[1].strip() in DDI.strip():
                 x = Range[0]
                 globals()[x].append(DDI)

     print(GBSMC)

为一个列表对象分配一系列名称:

AEDUB = ATVIE = ATVZR = BEANT = ... = SESOL = TRIST = []

现在,所有这些名称都引用相同的列表对象 ,而不是单独的对象。 Python名称只是标签或名称标签 ,像列表对象之类的值可以具有多个此类标签:

>>> AEDUB = ATVIE = ATVZR = []  # 3 names for the same list
>>> AEDUB.append('foo')  # append to the list via one name
>>> ATVIE  # and the same change is visible via another other name
['foo']
>>> ATVZR  # and another
['foo']
>>> ATVIE is ATVZR is AEDUB  # all names refer to the same object?
True

您必须为每个名称分别键入分配:

AEDUB = []
ATVIE = []
ATVZR = []
BEANT = []
... 
SESOL = []
TRIST = []

但是,您确实要避免使用globals()和单独的命名列表。 请改用字典:

site_codes = {}

site_codes.setdefault(Range[0], []).append(DOI)

dict.setdefault()方法在此处采用一个键( Range[0] ),如果该键已经存在,则返回该键的值。 如果缺少,则第二个参数用于首先设置字典中的值。 因此,如果Range[0]尚未在字典中,则它将被设置为空列表,否则将返回现有列表。 然后, .append()调用将追加到Range[0]的列表中。

请注意,您不必真正键入所有这些名称!

然后,您可以在其他地方使用site_codes['AEDUB']等引用这些列表,或者只访问for site_code in site_codes:带有for site_code in site_codes:的名称序列for site_code in site_codes:或者访问for site_code, values in site_codes.values():中带有for site_code, values in site_codes.values():的名称和列表。 for site_code, values in site_codes.values():等等。这比使用全局名称实际得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM