Почему число случаев не увеличивается? - PullRequest
0 голосов
/ 26 октября 2019

Вот моя проблема: у меня есть словарь (dico), и я хочу подсчитать, сколько раз для двух разных ключей они оба появляются на одной строке в файле "file.tsv", который выглядитнапример:

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 ...
...

Например, значения клавиш банана и яблока появляются в строке 1, поэтому независимо от того, сколько раз они появляются, они все еще присутствуют, и поэтому у нас есть 1 общая строка, иЯ хочу сделать это на всех строках файла

. Для этого я добавил шаблон '_\w+' после каждого значения, а затем сделал регулярное выражение с функцией re.search.

from itertools import product
import csv

dico = {
    "banana": "sp_345",
    "apple": "ap_456",
    "pear": "pe_345",
    "cherry": "ap_345",
    "coco": "sp_543",
}

counter = {}
with open("file.tsv") as file:
    reader = csv.reader(file, delimiter="\t")
    for line in reader:
        for key1, key2 in product(dico, dico):
            if key1 >= key2:
                continue
            counter[key1, key2] = 0
            k1 = k2 = False
            for el in line:
                if re.search(dico[key1]+'_\w+', el):
                    k1 = True
                elif re.search(dico[key2]+'_\w+', el):
                    k2 = True
                if k1 and k2:
                    counter[key1, key2] += 1
                    break

for key, val in counter.items():
    print(key, val)
* 1011. * Но события останавливаются на 0:
Apple banana 0
pear banana 0
pear apple 0

Ответы [ 2 ]

1 голос
/ 26 октября 2019

k1 и k2 не могут быть оба True, потому что вы инициализируете и с False и устанавливаете самое большее один на True.

elif re.search(dico[key2]+'_\w+', el):
    k2 = True

должно быть

if re.search(dico[key2]+'_\w+', el):
     k2 = True
0 голосов
/ 26 октября 2019

Ваша строка

counter[key1, key2] = 0

должна появляться только тогда, когда (key1, key2) еще не имеет значения. Например, добавив тест:

if (key1, key2) not in counter:
    counter[key1, key2] = 0

Или вы можете установить счетчик [key1, key2] в 0 для всех пар перед открытием CSV. Как в:

for key1, key2 in product(dico, dico):
    if key1 < key2:
        counter[key1, key2] = 0
counter = {}
with open("file.tsv") as file:
    ....  

Также

elif re.search(dico[key2]+'_\w+', el):

должно быть

if re.search(dico[key2]+'_\w+', el):

В противном случае вы никогда не найдете ключ 2, когда найдете ключ1

...