簡體   English   中英

在嵌套的 for 循環中使用列表推導

[英]Using list comprehension in nested foor loops

我正在嘗試重構代碼,我看到 3 個嵌套循環可能會更改為列表推導,但這比我想象的要棘手。 有人能幫忙嗎?

l_ids=["0000000","0000010","0000020","0000030","0000040","0000050","0000060","0000070","0000080","0000090","0000100",
                 "0000110","0000120","0000130","0000140","0000150"]
l_years=[2018,2019,2020,2021,2022]
l_means=["car","train","plane","other","freight"]
l_id=[]
l_year=[]
l_mean=[]
l_energy=[]

for supp_id in  l_ids:
    for year in l_years:
        for mean in l_means:
            l_id.append(supp_id)
            l_year.append(year)
            l_mean.append(mean)
            l_energy.append(random.randint(100000000, 999999999))

對於 l_id、l_year 和 l_mean,您可以使用列表推導,如下所示:

l_id = [supp_id for supp_id in l_ids for year in range(len(l_years)) for mean in range(len(l_means))]
l_year = [year for supp_id in range(len(l_ids)) for year in l_years for mean in range(len(l_means))]
l_mean = [mean for year in range(len(l_years)) for supp_id in range(len(l_ids)) for mean in l_means]

對於 l_energy,random 有 a.choices() function,您可以使用它來獲取指定長度的隨機數列表。 我已將長度指定為所有 3 個列表長度的乘積(也可以使用 .sample(),但會避免重復):

l_energy = random.choices(range(100000000, 999999999), k=len(l_ids)*len(l_years)*len(l_means))

但是,如果您希望它成為列表理解,您可以這樣做:

l_energy = [random.randint(100000000, 999999999) for supp_id in range(len(l_ids)) for year in range(len(l_years)) for mean in range(len(l_means))]

我不確定您對這些列表的最終計划是什么,itertools 可能是更好的解決方案。

我不確定你為什么要這樣做。 我認為,在這種情況下,列表推導會使事情變得更加復雜,但是,如果我要使用列表推導來做到這一點,我會這樣做:

l_ids = [str.format("{:0>7}", i) for i in range(0, 160, 10)]
l_years = list(range(2018, 2023))

rand_energy = lambda: random.randint(100000000, 999999999)

tmp = [(supp_id, year, mean, rand_energy())
        for supp_id in l_ids for year in l_years for mean in l_means]

l_id, l_year, l_mean, l_energy = [[t[i] for t in tmp]
                                      for i in range(len(tmp[0]))]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM