Как исправить список (иногда неправильный) с помощью словаря?
Я все еще пытаюсь заставить закомментированные разделы в цикле for работать так, как предложил Klasske ниже. Я включил свой собственный тестовый скрипт, к которому я добавил комментарии, чтобы объяснить мои мысли. Любой совет будет принят во внимание.
У меня есть файл (infile1.tsv), который содержит правильные пары для использования в качестве словаря, и у меня есть файл, который иногда имеет неправильный 1-й столбец (infile2.tsv). Я не могу просто +1 к колонке выше.
- заменить 1-й столбец, если у него нет "Title_#", где # может быть любой длины
- нежелательным именем может быть любая строка символов и цифр, которая не соответствует шаблону Title_ #
- имя для замены из infile2.tsv указано в infile1.tsv (1-й столбец) с исправленным именем (2-й столбец)
Мой тестовый скрипт:
#!/usr/bin/python
# import dictionary of pairs, then replace those which aren't Title_
# USAGE: python import_dict_then_replace.py
import csv
import string
infile1_dict = {} # use dict for the library to replace as (key, value)
with open('infile1.tsv','rb') as tsvin:
tsvin = csv.reader(tsvin, delimiter='\t') # imports the file as a tsv
for row in tsvin: # each row in the tab-delimited input file
infile1_dict.update({row[0]:row[1]}) # use 1st row (0) as key, use 2nd row (1) as value in the dictionary
#print infile1_dict # to verify dictionary is read in correctly
outputstring = [] # use list because it's ordered and can interate through each just once (linear search) to check against the dictionary for replacement
outlist = [] # make another empty list
with open('infile2.tsv','rb') as inlist:
inputlist = inlist.read().replace('\n','') # gets rid of all newlines to import the rows as list; rstrip('\n') just removes newlines from last lines
for index, item in enumerate(inputlist): # iterate over each item in inputlist; need the index to reference for each item in the list
if 'Title_' in item: # when Title_ is in the list's item
outputstring.append(item) # just put the Title_ item into the list
if not 'Title_' in item: # when Title_ is not in the list's item
correction = infile1_dict.get(item, "key was not in dictionary")
outlist = inlist.replace(item, correction, 1) # replaces the unmatching item with the corresponding value in the dictionary
outputstring = inlist.append(outlist) # adds to the list
print outputstring
infile1.tsv
junk_name1 Title_3
junk-name2 Title_184
junk.name3 Title_122
junkname4 Title_96
infile2.tsv
Title_1
Title_2
junk_name1
Title_94
Title_95
junkname4
Title_121
junk.name3
из-complete.txt
Title_1
Title_2
Title_3
Title_94
Title_95
Title_96
Title_121
Title_122
из-replaced.tsv
junk_name1 Title_3
junkname4 Title_96
junk.name3 Title_122
2 ответа
Это работает, но, вероятно, не очень элегантно
#!/usr/bin/python
#imports dictionary of pairs, then replaces those which aren't Title_
import csv
infile1dict = {} # dict for the library to replace as (key, value)
with open('infile1.tsv','r') as tsvin:
tsvin = csv.reader(tsvin, delimiter='\t') # imports the file as a tsv
for row in tsvin: # each row in the tab-delimited input file
infile1dict.update({row[0]:row[1]}) # use 1st row (0) as key, use 2nd row (1) as value in the dictionary
print (infile1dict)
inlist = [] # list to be tested against the dict library
with open('infile2.tsv','r') as inlist:
inlist = [line.strip() for line in inlist.readlines()] # strips off the \n, grabs each line as an item
print (inlist)
outlist = [] # list for each item to be added into
for item in inlist:
if 'Title_' in item:
print 'Item %s will go directly into the output list.' % item
itmstr = "".join(item) # converts item tuple to item string for append function
outlist.append(itmstr) # adds item to the output list from input file list
if not 'Title_' in item:
print 'Item %s will be replaced with the dictionary.' % item
correction = infile1dict.get(item, "The inlist's item was not a key in the dictionary.")
outlist.append(correction) # adds the correction string to the list
print('\t'.join(map(str,outlist)))
with open('out-complete.txt', 'w') as outobj:
outobj.writelines('\n'.join(map(str,outlist)))
Мне потребовалось некоторое время, чтобы понять, что вы спрашивали, но я думаю, что вы хотите сделать, это прочитать первый файл в словарь пар ключ-значение:
import csv
infile1_dict = {}
with open('infile1.tsv','rb') as tsvin:
tsvin = csv.reader(tsvin, delimiter='\t')
for row in tsvin:
infile1_dict.update({row[0]:row[1]})
Затем вы захотите прочитать второй файл и заменить его, а также следить за замененными значениями:
replaced_values_dict = {}
with open('infile2.tsv','rb') as tsvin, open('out-complete.tsv', 'wb') as tsvout:
tsvin = csv.reader(tsvin, delimiter='\t')
tsvout = csv.writer(tsvout, delimiter='\t')
for row in tsvin:
if not 'Title_' in row[0]:
#write to new file with item found in infile1_dict
#save pair in replaced_values_dict
else:
#write as is
Это то, что вы имели в виду?