我有两个列表如下:
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']
答案 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的代码,但应该有效。