【问题标题】:Is it possible use one loop ouput as an input for another loop?是否可以使用一个循环输出作为另一个循环的输入?
【发布时间】:2016-10-18 00:28:09
【问题描述】:

我有两个列表如下:

NumberandLetter1=['1 E\n', '2 K\n']
NumberandLetter2=['1 E,L,K\n', '2 K,L\n']

从第一个列表中,我尝试制作 NUMBERS:LETTERS 的字典,并且为 list1 制作字典没有任何问题:

NumberandLetter1=['1 E\n', '2 K\n'] ----> {'E': 1, 'K': 2}

但是,对于第二个列表,我想用带有换行符的相应数字替换每个逗号,并将其写为具有执行时间的新文件:

NumberandLetter2=['1 E,L,K\n', '2 K,L\n'] ---> ['1 E\n1 L,\n1 K\n', '2 K,\n2 L\n']
executedTimeOutput.txt=['1 E\n1 L,\n1 K\n', '2 K,\n2 L\n']

然后,使用这个 executeTimeOutput.txt 作为下一个循环 inroder 的输入,以获取与 NumberandLetter1(list1) 相同的字典

重点是:

case1 --> 如果单行有一个数字和一个字母,则创建一个字典。

case 2 -> 如果单行有一个数字和多个字母,则每个字母都有一个相应的编号作为新行。

我尝试过的:

当我遇到案例 2 -> 我只是将每个逗号替换为一个带有换行符的数字,并将其写为带有执行时间的 newfile。然后使用这个新文件作为输入来获得类似案例 1 的输出。

它没有将文件作为输入。有人可以告诉我如何解决这个问题或一些不同的想法来获得相同的结果。

import os
import sys
import random
from itertools import groupby, combinations, chain
from time import gmtime, strftime

def main(NumberandLetter,current):

    Mutant_dict = {}
    res_key = ''

    fh = open(NumberandLetter, 'r').readlines()

    MutatedAll = open(current+"output.txt", "w")
    for i in fh:
        if "," not in i:
            res_key = str(filter(str.isalpha, i))
            Mutant_dict[res_key] = int(filter(str.isdigit, i))
        else:
            MutatedAll.write(i.replace(",", "\n" + i[0] + " "))

            fh1 = open(os.getcwd()+"/"+current+"output.txt", 'r').readlines()
            for i in fh1:
               res_key = str(filter(str.isalpha, i))
               Mutant_dict[res_key] = int(filter(str.isdigit, i))

if __name__ == "__main__":
    main(sys.argv[1],strftime("%d%m%y_%H%M%S", gmtime()))

预期输出:

NumberandLetter1=['1 E\n', '2 K\n'] ----> {'E': 1, 'K': 2}
NumberandLetter2=['1 E,L,K\n', '2 K,L\n'] ----> {'E': 1, 'L': 1, 'K':1, 'K':2, 'L':2}

至于现在我是这样的:

    NumberandLetter2=['1 E,L,K\n', '2 K,L\n'] ---->{'ELK': 1, 'KL': 2}

在else条件下我做的很简单:

hi=[]
Mt={'ELK': 1, 'KL': 2}
for key,val in Mt.iteritems():
    for k in key:
        hi.append(k+'%d' % (val,))

OUTPUT=['E1', 'L1', 'K1', 'K2', 'L2']

【问题讨论】:

  • 给我一个建议:Mt={'ELK': 1, 'KL': 2} for key,val in Mt.iteritems(): for k in key: print k,val
  • {'E': 1, 'L': 1, 'K':1, 'K':2, 'L':2} 不是有效的 Python 字典。重复键!

标签: python list loops dictionary file-handling


【解决方案1】:

我认为您对文件的额外写入使事情变得过于复杂。你根本不需要那个。您甚至不需要区分这些情况,因为 case1 是 case2 的特殊情况。看看这个:

def process(iterator):
    result = {}
    for line in iterator:
        value, _, rest = line.strip().partition(' ')
        value = int(value)
        for subline in rest.split(','):
            result[subline] = value
    return result

with open('my_file.txt') as fo:
    Mutant_dict = process(fo)

请注意,字典不能有重复,因此您的预期输出是不可能的。但是您可以轻松地将我写的内容转换为例如(key, value) 对的列表。

【讨论】:

    【解决方案2】:

    你可以用以下方式重写你的for循环

    for i in fh: 
        s = i.strip().split(" ")
        value = int(s[0])
        keys = s[1].split(",")
        for key in keys:
            Mutant_dict[key] = value
    

    string.split() 在这里很有效。

    但是,代码仍然可能无法满足您的要求:字典只能具有唯一键,因此您不能期望 "{'E': 1, 'L': 1, 'K':1, ' K':2, 'L':2}" 完全作为字典发生。

    您可以使用其他数据结构来存储信息,或者您可能想要计算数字的总和(到 {'E': 1, 'L': 3, 'K':3})。无论哪种方式都是可能的。我只是不知道你的意图是什么。因此,它留作练习;)

    【讨论】:

      【解决方案3】:

      您可以使用此函数将 case2 输入转换为 case1:

      NumberandLetter2 = ['1 E,L,B,A,K\n', '2 K,L\n'] 
      
      def convert_list(alist):
          for i_list, items in enumerate(alist):
              print(items)
              if "," in items:
                  slices = items.split(",")
                  no_id = slices[0][0]
                  slices[0] += '\n'
                  for i in range(1, len(slices)-1):
                      slices[i] = no_id + ' ' + slices[i] + '\n'
                  slices[-1] = no_id + ' ' + slices[-1]
                  alist[i_list] = slices
          return [item for sublist in alist for item in sublist]
      
      print(convert_list(NumberandLetter2)) #prints: ['1 E\n', '1 L\n', '1 B\n', '1 A\n', '1 K\n', '2 K\n', '2 L\n']
      

      它只需要一个列表并写入另一个列表。绝对不是最 Pythonic 的代码,但应该可以工作。

      【讨论】:

        猜你喜欢
        • 2018-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多