【问题标题】:Print nested list elements one after another一个接一个地打印嵌套列表元素
【发布时间】:2016-06-02 22:16:18
【问题描述】:

我有一个列表,里面有几个嵌套列表,如下所示:

MyMasterListwithListsInside = [List1,List2,List3,List4]
List1 = [f,e,g,t]
List2 = [t,r,e,y]
List3 = [g,k,f,k]
List4 = [o,y,[t,y]]

我正在尝试使输出文件看起来像这样:

file 1   
f or List1[1] \n   
t or List2[1] \n   
g or List3[1] \n  
o or List4[1] \n   

file 2  
e or List1[2] \n  
r or List2[2] \n   
k or List3[2]\n   
y or List4[2]\n  

file 3  
g or List1[3] \n   
e or List2[3] \n   
f or List3[3] \n   
t or List4[3][1] \n   
y or List4[3][2] \n   

到目前为止我已经尝试过:

for x in a:
   with open("whatever","a", encoding="utf-8") as file:
   file.write("\n")
   for y in x:
     if y is not None:
       file.write("\n")
       file.write(y)
       x.remove(y)
       for f in ok:
         file.write("\n")
         file.write(f)
         ok.remove(f)
         for k in kok:
            file.write("\n")
            file.write(k)
            kok.remove(k)
            for s in sok:
               file.write("\n")
               file.write(s)
               sok.remove(s)
               for o in yok:
                  for ik in o:
                     if ik is not None:
                        file.write("\n")
                        file.write(ik)        
                     else:
                          yok.remove(o)
      else:
           print("Done!")

我还尝试了几种不同缩进的组合。它们都不起作用。要么我得到List1[1:4],List2[1:4],... 等输出或List1[1],List2[1],List3[1:4],... 等。有一次我设法找到缩进的写组合,但后来我遇到了语法错误,在调试时,我丢失了正确的形式。但是,我相信有比成为“for”的领导者更优雅的解决方案。 我的实际数据是一个包含多个嵌套列表的列表,每个列表包含十个元素。其中之一还包含 10 个嵌套列表。我也可以采用如下格式:

f or List1[1] \n   
t or List2[1] \n   
g or List3[1] \n  
o or List4[1] \n   


e or List1[2] \n  
r or List2[2] \n   
k or List3[2]\n   
y or List4[2]\n  


g or List1[3] \n   
e or List2[3] \n   
f or List3[3] \n   
t or List4[3][1] \n   
y or List4[3][2] \n 

提前致谢

【问题讨论】:

  • 这个问题完全没有意义。这些不是嵌套列表,它们是字符串。您还有一些非常奇怪的逻辑,例如在其自己的行上的相应位置打印每个元素,除非该元素恰好看起来像一个列表,然后它占用n 行(因为它的@987654329 @成员)?到底发生了什么?
  • 你是对的,我的错,请参阅更正。
  • 它看起来 几乎 像您希望 itertools.chain.fromiterable(zip(* MyMasterListwithListsInside)) 生成您想要的订单,但 List4[4] 实际上并不存在,所以我不明白您实际上想要做什么做。
  • List4[4] 正确,立即更正

标签: python-3.x output nested-lists file-writing listiterator


【解决方案1】:

你可以做这样的递归(伪代码):

for each position in a
    printPosition()

function printPosition(arrays, position)
    for each element in array
        if array[position] != array
            print array[position]
        else 
            for each position 
               printPosition()

这对你有意义吗?

【讨论】:

    【解决方案2】:

    毕竟解决方案是使用 itertools。这是我的整体功能:

        def metin_işle_Page(Kök): 
            sayfa1 = BeautifulSoup(Kök, "lxml") # Page with 10 results
            sayfa = sayfa1.find_all("result") # Each of them are seperate xml #files, 
    #with json data in between and 
    #each of them having the same structure
            başlıklar2 = [x.find("title") for x in sayfa] 
            başlıklar = [x.get_text() for x in başlıklar2] # A list for their titles 10 elements
            print("Başlıklar Alındı")
            kayıt_kaynağı2 = [x.find("recordsourceinfo") for x in sayfa] # a list for their id
            kayıtUrl = [link.get("landingpage") for link in kayıt_kaynağı2]
            kayıt_id = [link.get_text(strip=True) for link in kayıt_kaynağı2]
            print("kayıt id ve ilgili urller alındı")
            nesne_tipi4 = [x.find("objecttype") for x in sayfa] # another list with 10 elements
            nesne_tipi = [x.get_text(strip=True) for x in nesne_tipi4]
            print("nesne tipleri alındı")
            malzeme3 = [x.find("material") for x in sayfa] # you get the idea ..........
            malzeme = [x.get_text(strip=True) for x in malzeme3]
            print("malzemeler alındı")
            boyut3 = [x.find("dimensions") for x in sayfa]
            boyut2 = [x.prettify(formatter="minimal") for x in boyut3]
            boyut = [x.strip() for x in boyut2]
            print("boyutlar alındı")
            tarihi2 = [x.find("origindating") for x in sayfa]
            kaynak_tarihi2 = [x.get_text(strip=True) for x in tarihi2]
            kaynak_tarihi = [x.strip() for x in kaynak_tarihi2]
            print("kaynak tarihleri alındı")
            eski_Yer2 = [x.find("ancientfindspot") for x in sayfa]
            eski_yer1 = [x.get_text("|", strip=True) for x in eski_Yer2]
            eski_yer = [x.strip() for x in eski_yer1]
            print("Eserin ait olduğu yer alındı")
            modern_yer3 = [x.find("modernfindspot") for x in sayfa]
            modern_yer1 = [x.get_text(strip=True) for x in modern_yer3]
            modern_yer = [x.strip() for x in modern_yer1]
            print("Eserin bulunduğu modern yer alındı")
            modern_ülke3 = [x.find("moderncountry") for x in sayfa]
            modern_ülke1 = [x.get_text(strip=True) for x in modern_ülke3]
            modern_ülke = [x.strip() for x in modern_ülke1]
            print("Eserlerin bulunduğu ülkeler alındı")
            korunma_ülkesi3 = [x.find("conservationcountry") for x in sayfa]
            korunma_ülkesi1 = [x.get_text("|", strip=True) for x in korunma_ülkesi3]
            korunma_ülkesi = [x.strip() for x in korunma_ülkesi1]
            print("Eserin korunduğu ülkeler alındı")
            müzesi3 = [x.find("museum") for x in sayfa]
            müzesi1 = [x.get_text("|", strip=True) for x in müzesi3]
            müzesi = [x.strip() for x in müzesi1]
            print("Eserin korunduğu Müze alındı")
            yazıttipi3 = [x.find("inscriptiontype") for x in sayfa]
            yazıttipi2 = [x.get_text(strip=True) for x in yazıttipi3]
            yazıt_tipi = [x.strip() for x in yazıttipi2]
            print("Yazıt tipleri alındı")
            yazıt_tekniği3 = [x.find("engravingtechnique") for x in sayfa]
            yazıt_tekniği2 = [x.get_text(strip=True) for x in yazıt_tekniği3]
            yazıt_tekniği = [x.strip() for x in yazıt_tekniği2]
            print("yazıt teknikleri alındı")
            metin_normal2 = [x.find("text") for x in sayfa]
            metin_normal1 = [x.get_text(strip=True) for x in metin_normal2]
            metin_normal = [x.strip()for x in metin_normal1]
            print("Metinler alındı")
            metin_epidoc3 = [x.find("textepidoc") for x in sayfa]
            metin_epidoc2 = [x.prettify(formatter="minimal") for x in metin_epidoc3]
            metin_epidoc = [x.strip() for x in metin_epidoc2]
            print("Epidoc metinleri alındı")
            kaynakça3 = [x.find_all("bibliography") for x in sayfa] # Here is the 
            #tricky part for every list so far there was only 1 element beneath the tag
            #corresponding in each results, but for this tag, there are 
            #sometimes 2 or more elements
            kaynakça4 = [] # I made a new list in order to match the number of other lists.
            for x in kaynakça3: # list containing more than one elements
                kaynaklar = [] # some empty list
                for y in x: # since x, a list of "bibliography" element for each element
                # of sayfa,a list of "result" elements, i call y, each attestation of
                # bibliography in x.
                    adf1 = y.get_text(strip=True) # I took the text of each attestation
                    #and reproduce them in another list. This way I got rid of the tags
                    # plus it is difficult to work with a Result Set, and less difficult
                    # to work with a list
                    adf = adf1.strip() 
                    kaynaklar.append(adf)
                kaynakça4.append(kaynaklar)
            kaynakça = []
            for g in kaynakça4: # here I tried to join together the nested lists within
            # the nested list element, so that I would have at most two level of nested
            #lists.
                zip(g)
                kaynakça.append(g)
            Genel_sayfa = [] # Then I created a master list and appended my processed
            Genel_sayfa.append(başlıklar) #elements within it.
            Genel_sayfa.append(kayıt_id)
            Genel_sayfa.append(kayıtUrl)
            Genel_sayfa.append(nesne_tipi)
            Genel_sayfa.append(malzeme)
            Genel_sayfa.append(boyut)
            Genel_sayfa.append(kaynak_tarihi)
            Genel_sayfa.append(eski_yer)
            Genel_sayfa.append(modern_yer)
            Genel_sayfa.append(modern_ülke)
            Genel_sayfa.append(korunma_ülkesi)
            Genel_sayfa.append(yazıt_tekniği)
            Genel_sayfa.append(yazıt_tipi)
            Genel_sayfa.append(metin_normal)
            Genel_sayfa.append(metin_epidoc)
            Genel_sayfa.append(kaynakça)
            Sıralı = itertools.chain.from_iterable(zip(* Genel_sayfa)) #used iterate tools
            sayfasayısı = list(range(0,112)) #over the lists which contain the same number
            for SayfaNo in sayfasayısı: #of elements
                with open("TümSayfa" + str(SayfaNo), "a", encoding="utf-8") as sonuç:
                    sonuç.write("\n")
                    for k in Sıralı:
                        sonuç.write("\n")
                        sonuç.write("\n")
                        afrc = str(k) #to assure that there was no problem in the output
                        sonuç.write("\n") # I changed the chain object to string 
                        sonuç.write(afrc)
                    sonuç.close()
    

    【讨论】:

    • 好的,我完全看不出你的问题帖子中的尝试与你试图应用于列表的逻辑有什么关系,但这似乎比原来的更不相关,你到底是什么在做什么?
    • @TadhgMcDonald-Jensen 使用代码我试图解析一个网页的响应对象,它产生 10 个结果。如果每个结果都是 x,则有 10x,每个结果都具有精确的结构。每个 x,有 4 个元素,称它们为 y,所以每个 x 有 10y。由于每个 x 都是相同的,因此区分它们的唯一方法是通过它们出现在结果列表中的顺序。这同样适用于每个 y,只能通过它们在 x 中出现的顺序来区分它们。我没有做的是通过使用字典结构来区分它们。这就是代码看起来一团糟的原因。
    • 好的,我看到几乎所有这些代码都在解析请求,但这与您询问的关于“我如何从 ”所以我真的很困惑你问你的问题到底想要什么......
    • @TadhgMcDonald-Jensen 由于我没有使用字典结构来存储结果数据,我一直在寻找一种解决方案,以按照它们在列表中出现的顺序迭代每个列表的每个元素,然后迭代工具确实有效。但是我会重新编写代码以使用字典结构,这个太脆弱了,无法在其他类似情况下使用。顺便感谢您的耐心等待。
    猜你喜欢
    • 2018-10-13
    • 2023-03-22
    • 2013-04-05
    • 2013-12-24
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多