匹配后追加到列表

2024-03-28 13:05:19 发布

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

在继承别人的工作后,我遇到了一个相当随机的问题。你知道吗

目前有2个CSV文件被导入python程序 1包含数字 1包含模式和站点代码

目前他的程序将正确导入两个CSV 并勾选“如果花样在数字里”,如果是,它会打印出它匹配的花样的数字,然后再打印站点代码。你知道吗

问题实际上是,他希望将每个匹配项附加到一个以他静态创建的站点代码命名的列表中。你知道吗

在谷歌搜索了很多次之后,globals()似乎是获得所需行为的选项

即:

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

其中范围[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)

Tags: csv代码in程序for站点range数字
1条回答
网友
1楼 · 发布于 2024-03-28 13:05:19

您为一系列名称指定了一个列表对象:

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

所有这些名称现在都指向同一个列表对象,而不是单独的对象。Python names are just labels or name tags,而类似列表对象的值可以有多个这样的标记:

>>> 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]not已经在字典中,那么它将被设置为空列表,否则将返回现有列表。然后.append()调用附加到Range[0]的列表。你知道吗

请注意,您永远不必实际键入所有这些名称!你知道吗

然后您可以在其他地方使用site_codes['AEDUB']等来引用这些列表,或者只使用for site_code in site_codes:访问一系列名称,或者使用for site_code, values in site_codes.values():等访问一个名称和列表。这比使用全局名称实用得多。你知道吗

相关问题 更多 >