Расчет разницы в списках - PullRequest
1 голос
/ 05 марта 2010

У меня есть два файла, и содержимое выглядит следующим образом:

альтернативный текст http://img144.imageshack.us/img144/4423/screencapture2b.png

альтернативный текст http://img229.imageshack.us/img229/9153/screencapture1c.png

Пожалуйста, обратите внимание только на жирный столбец и красный столбец. Оставшийся текст является ненужным и ненужным. Как видно из двух файлов, они во многом похожи. Я пытаюсь сравнить выделенный жирным шрифтом текст в file_1 и file_2 (он не выделен жирным шрифтом, но надеюсь, что вы можете различить его в одном столбце), и если они различаются, я хочу распечатать красный текст из file_1 Я добился этого с помощью следующего скрипта:

import string
import itertools

chain_id=[]
for file in os.listdir("."):
    basename = os.path.basename(file)
    if basename.startswith("d.complex"):
        chain_id.append(basename)

for i in chain_id:
    print i
    g=codecs.open(i,  encoding='utf-8')

    f=codecs.open("ac_chain_dssp.dssp",  encoding='utf-8')
    for (x, y) in itertools.izip(g,  f): 
            if y[11]=="C":
                if y[35:38]!= "EN":
                    if y[35:38] != "OTE":
                        if x[11]=="C":
                            if x[12] != "C":
                                if y[35:38] !=x[35:38]:
                                    print x [7:10]


    g.close()
    f.close()

Но результаты, которые я получил, оказались не такими, как я ожидал. Теперь я хочу изменить приведенный выше код таким образом, чтобы при сравнении полужирного столбца, если разница между значениями превышала 2, он должен был распечатать результаты. Например, строка-1 полужирного столбца в файле_1 равна 83, а в файле_2 - 84, поскольку разница между ними меньше двух, я хочу, чтобы ее отклонили.

Может кто-нибудь помочь мне добавить оставшийся код? Ура, Chavanak

PS: Это не домашнее задание:)

Ответы [ 3 ]

2 голосов
/ 05 марта 2010

Прямой ответ на ваш вопрос - изменить последнее условие,
if y[35:38] !=x[35:38]: так что вместо этого «field» в [35:38] преобразуется в int (или float ...), и к ним можно применить разницу. Давая что-то вроде

   try:
     iy = int(y[35:38])
     ix = int(x[35:38])
   except ValueError:
     # here for whatever action is appropriate, including silent ignoring.
     print("Unexpected value for record # %s" % x[7:10])

   if abs(ix - iy) > 2:
     print(x[7:10])

Более косвенно, фрагмент в вопросе подсказывает следующие замечания, которые, в свою очередь, могут предложить различные подходы к проблеме.

  • Во-первых, если файлы строго «фиксированного формата», если они очень большие, и / или если с любыми другими значениями «полей», найденными в файле, ничего не делается, текущий подход действителен и вероятно, очень эффективный.
  • альтернативно, логику можно сделать более устойчивой к возможным изменениям в структуре файла и т. Д. Путем анализа «полей» файла, вместо того, чтобы рассматривать их как кусочки длинной строки. Загрузите модуль csv стандартной библиотеки для возможной поддержки парсера.
  • некоторые тесты кажутся глупыми / всегда верными и т. Д. (Например, сравнение 3-символьного среза с 2-символьным строковым литералом. Помимо логически неверного, это также указывает на более «проанализированное» решение, в котором такие логические ошибки легче избежать или более очевидно.
2 голосов
/ 05 марта 2010

Ничего общего с вашей проблемой, но это:

        if y[11]=="C":
            if y[35:38]!= "EN":
# I don't see any "EN" or "OTE" anywhere in your sample input.
# In any case the above condition will always be true, because
# y[35:38] appears to be a 3-byte string but "EN" is a 2-byte string.
                if y[35:38] != "OTE":
                    if x[11]=="C":
                        if x[12] != "C":
                            if y[35:38] !=x[35:38]:
                                print x [7:10]

это ммммм ...

Вы можете рассмотреть альтернативный способ выражения, например,

if (x[11] == "C" == y[11]
and x[12] != "C"
and y[35:38] not in ("EN?", "OTE")
and y[35:38] != x[35:38]):
    print x[7:10]
0 голосов
/ 05 марта 2010

Я не полностью понял вашу проблему, но

Файл 1

100 C 20.2
300 B 33.3

Файл 2

110 C 20.23
320 B 33.34

и вы хотите сравнить 3-й столбец двух файлов.

lines1 = file1.readlines()
list1 = [float(line.split()[2]) for line in lines1] # list of 3rd column values

lines2 = file2.readlines()
list2 = [float(line.split()[2]) for line in lines2]

result = map(lambda x,y: x-y < 2,list1,list2)

ИЛИ

 result = [list1[i]-list2[i] for i in range(len(list1)) if list1[i] - list2[i] > 2]

Это то, что вы хотите ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...