Печать элементов вне списка

1

У меня есть определенная проверка, и если проверка удовлетворяет, я хочу, чтобы результат был напечатан. Ниже приведен код:

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

Теги:
list
printing

2 ответа

9
Лучший ответ

Чтобы преобразовать список строк в одну строку с пробелами между элементами списка, используйте ' '.join(seq).

>>> ' '.join(['1','2','3'])
'1 2 3'

Вы можете заменить ' ' любой строкой, которую вы хотите между элементами.

  • 0
    и добавьте «print» в начало, если вы не используете интерактивную подсказку.
  • 0
    str.join качестве аргумента str.join принимает любую итерируемую строку. Тот, который вы передали, был списком , а не массивом; «массив» относится к другому, не часто используемому типу в Python.
Показать ещё 1 комментарий
2

Марк Рушаков, похоже, решил вашу ближайшую проблему, но есть некоторые другие улучшения, которые могут быть внесены в ваш код.

  • Всегда используйте контекстные менеджеры (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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню