是否可以使用一个循环输出作为另一个循环的输入?

时间:2016-06-16 13:00:01

标签: python list loops dictionary file-handling

我有两个列表如下:

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

从第一个List我尝试编写NUMBERS字典:LETTERS,我没有为list1制作字典有任何问题:

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

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

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']

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

重点是:

case1 - >如果单行有一个数字,一个字母组成一个字典。

案例2 - >如果单行有一个数字,而且多个字母使每个字母的相应号为新行。

我尝试过:

当我遇到案例2时 - >我刚刚用换行符替换了每个逗号,并将其写为带有executiontime的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()))

EXPECT OUTPUT:

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}

在其他情况下我做得非常简单:

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']

3 个答案:

答案 0 :(得分: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)对列表。

答案 1 :(得分:1)

您可以通过以下方式重写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,&#39 ; L':1,' K':1,' K':2,' L':2}"根本就是字典。

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

答案 2 :(得分:1)

您可以使用此功能将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的代码,但应该有效。