У меня есть определенная проверка, и если проверка удовлетворяет, я хочу, чтобы результат был напечатан. Ниже приведен код:
import string
import codecs
import sys
y=sys.argv[1]
list_1=[]
f=1.0
x=0.05
write_in = open ("new_file.txt", "w")
write_in_1 = open ("new_file_1.txt", "w")
ligand_file=open( y, "r" ) #Open the receptor.txt file
ligand_lines=ligand_file.readlines() # Read all the lines into the array
ligand_lines=map( string.strip, ligand_lines ) #Remove the newline character from all the pdb file names
ligand_file.close()
ligand_file=open( "unique_count_c_from_ac.txt", "r" ) #Open the receptor.txt file
ligand_lines_1=ligand_file.readlines() # Read all the lines into the array
ligand_lines_1=map( string.strip, ligand_lines_1 ) #Remove the newline character from all the pdb file names
ligand_file.close()
s=[]
for i in ligand_lines:
for j in ligand_lines_1:
j = j.split()
if i == j[1]:
print j
Вышеприведенный код отлично работает, но когда я печатаю j, он печатается как ['351', '342'], но я ожидаю получить 351 342 (с одним пробелом между ними). Поскольку это скорее вопрос python, я не включил входные файлы (в основном это просто цифры).
Кто-нибудь может мне помочь?
Приветствия,
Chavanak
Чтобы преобразовать список строк в одну строку с пробелами между элементами списка, используйте ' '.join(seq)
.
>>> ' '.join(['1','2','3'])
'1 2 3'
Вы можете заменить ' '
любой строкой, которую вы хотите между элементами.
Марк Рушаков, похоже, решил вашу ближайшую проблему, но есть некоторые другие улучшения, которые могут быть внесены в ваш код.
with open(filename, mode) as f:
) для открытия файлов, вместо того, чтобы полагаться на close
получать вызовы вручную.Не утруждайте себя чтением целого файла в память очень часто. Зацикливание над some_file.readilines()
может быть заменено непосредственно на цикл some_file
.
map(string.strip, ligland_file)
или еще лучше [line.strip() for line in ligland_file]
Не выбирайте имена, чтобы указать тип объекта, к которому они относятся. Эта информация может быть найдена другими способами.
Для exmaple код, который вы опубликовали, может быть упрощен к чему-то по строкам
import sys
from contextlib import nested
some_real_name = sys.argv[1]
other_file = "unique_count_c_from_ac.txt"
with nested(open(some_real_name, "r"), open(other_file, "r")) as ligand_1, ligand_2:
for line_1 in ligand_1:
# Take care of the trailing newline
line_1 = line_1.strip()
for line_2 in ligand_2:
line_2 = line2.strip()
numbers = line2.split()
if line_1 == numbers[1]:
# If the second number from this line matches the number that is
# in the user file, print all the numbers from this line
print ' '.join(numbers)
который является более надежным, и я считаю, что его легче читать.
Обратите внимание, что алгоритмическая производительность этого далеко не идеальна из-за этих вложенных циклов. В зависимости от ваших потребностей это потенциально может быть улучшено, но поскольку я точно не знаю, какие данные вам нужно извлечь, чтобы рассказать вам, можете ли вы.
Время, которое в настоящее время занимает мой код, а ваше - O (nmq), где n - количество строк в одном файле, m - количество строк в другом, q - длина строк в unique_count_c_from_ac. текст. Если два из них являются фиксированными/малыми, то у вас есть линейная производительность. Если два могут расти произвольно (я могу себе представить, что n и m могут?), Тогда вы можете изучить улучшенный алгоритм, возможно, используя наборы или dicts.
str.join
качестве аргументаstr.join
принимает любую итерируемую строку. Тот, который вы передали, был списком , а не массивом; «массив» относится к другому, не часто используемому типу в Python.