Использование условия внутри понимания слова: проблема скрипта - PullRequest
0 голосов
/ 06 ноября 2019

У меня проблема с моим состоянием внутри моего dict

Итак, у меня есть файл 'test', подобный этому:

sp_345_4567 pe_645_4567876  ap_456_45678    pe_645_4556789
sp_345_567  pe_645_45678
pe_645_45678    ap_456_345678
sp_345_56789    ap_456_345
pe_645_45678    ap_456_345678
sp_345_56789    ap_456_345
s45678  f45678  f456789 ap_456_52546135

и словарь, подобный этому:

dico = {
    "banana": "sp_345",
    "apple": "ap_456",
    "pear": "pe_645",
}

Затем я хочу сделать сравнение между значениями моего первого словаря с именем dico и увидеть, например, количество раз, когда банановый ключ появляется в каждой строке (и, следовательно, сделать это для всех ключей моего словаря), кромепроблема в том, что значения моего dico не равны значениям в моем словаре, потому что за ними следует этот шаблон '_ \ w +' '

Я пытался использовать dict-понимание

import csv
import re

dico = {
    "banana": "sp_345",
    "apple": "ap_456",
    "pear": "pe_645",
}

with open("test.txt") as file :
    reader = csv.reader(file, delimiter ='\t')
    for li in reader:
        pattern = re.search(dico["banana"]+"_\w+", str(li))
        if pattern:
            final_dict = {"line" + str(index + 1):
                          {key: line.count(text) for key, text in dico.items()}
                          for index, line in enumerate(reader)}
        print(final_dict)

Но когда я печатаю свой последний словарь, для банана ставится только 0 ...

{'line1': {'banana': 0, 'apple': 0, 'pear': 0},
 'line2': {'banana': 0, 'apple': 0, 'pear': 0},
 'line3': {'banana': 0, 'apple': 0, 'pear': 0},
 'line4': {'banana': 0, 'apple': 0, 'pear': 0},
 'line5': {'banana': 0, 'apple': 0, 'pear': 0},
 'line6': {'banana': 0, 'apple': 0, 'pear': 0}}

Так что да, теперь это выглядит немного больше, чем я хотел, но вхождения неподняться ....: / Может быть, мое состояние должно быть в глубоком понимании ??

Может кто-нибудь помочь?

Ответы [ 3 ]

2 голосов
/ 06 ноября 2019

Это не ответит на ваш вопрос об использовании диктовок, потому что, как прокомментировал @barny, я не думаю, что они подходят для того, что вы пытаетесь сделать, потому что это слишком сложно и слишком много вещей происходит,Тем не менее, я публикую код, показывающий, как сделать это довольно кратким, эффективным и читабельным способом:

Он ищет все шаблоны в каждой строкеCSV-файл при подсчете количества совпадений, которые он находит для каждого, а затем добавляет это к final_dict впоследствии.

import csv
import re


dico = {
    "banana": "sp_345",
    "apple": "ap_456",
    "pear": "pe_645",
}

patterns = {fruit: (prefix + r'_\w+') for fruit, prefix in dico.items()}
final_dict = {}

with open("test_ids.txt", newline='') as file:
    reader = csv.reader(file, delimiter ='\t')

    for index, li in enumerate(reader, 1):
        li = str(li)
        totals = dict.fromkeys(dico, 0)  # Zero fruit line totals.
        for fruit, pattern in patterns.items():
            matches = re.findall(pattern, li)
            totals[fruit] += len(matches)
        final_dict["line" + str(index)] = totals # Add line totals to final dict.

from pprint import pprint
pprint(final_dict, width=60)

Вывод:

{'line1': {'apple': 1, 'banana': 1, 'pear': 2},
 'line2': {'apple': 0, 'banana': 1, 'pear': 1},
 'line3': {'apple': 1, 'banana': 0, 'pear': 1},
 'line4': {'apple': 1, 'banana': 1, 'pear': 0},
 'line5': {'apple': 1, 'banana': 0, 'pear': 1},
 'line6': {'apple': 1, 'banana': 1, 'pear': 0},
 'line7': {'apple': 1, 'banana': 0, 'pear': 0}}
1 голос
/ 06 ноября 2019

С вашим пониманием речи все в порядке. Единственная проблема, которую я нашел здесь, с читателем CSV. Он читает только первую строку .txt файла, по крайней мере, в моем случае, поэтому я сделал это классическим способом, и все это работает просто отлично. Я оставил CSV вне.

import re

dico = {
    "banana": "sp_345",
    "apple": "ap_456",
    "pear": "pe_645",
}

with open("test.txt", "r") as file :
    file = file.readlines()
    for i in file:
        i = i.strip()
        pattern = re.search(dico["banana"]+"_\w+", i)
        if pattern:
            final_dict = {"line" + str(index + 1):
                {key: line.count(text) for key, text in dico.items()}
                for index, line in enumerate(file)}
    print(final_dict)
0 голосов
/ 06 ноября 2019

Инициализировать final_dict в цикле:

    for li in reader:
        pattern = re.search(dico["banana"]+"_\w+", str(li))
        final_dict = {}
        if pattern:
            final_dict = {"line" + str(index + 1):
                          {key: line.count(text) for key, text in dico.items()}
                          for index, line in enumerate(reader)}
        print(final_dict)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...