У меня ниже dict:


wordPos = {}
words = [...] #Removed for simplicity

for i, word in enumerate(words):
     wordPos[i] = ({word[5]: word[4]})

Что в конечном итоге становится:

>>> wordPos
{0: {1: 'Kontakt'},
 1: {2: 'email@domain.com'}, 
 2: {3: 'domain.com'}}

Теперь я пытаюсь найти в словаре выше и, если строка / выражение существует, он должен вернуть «ключ» для значения.

Так, например:

string = "@domain.com"

if string in wordPos.values():
   print("The string: {}, exists in the dictionary. The key for this is: {}".format(string, key))

Однако я не уверен, как искать в словаре и вернуть ключ (значения).

Кроме того, я немного не уверен, нужно ли мне использовать RegEx для фактического сопоставления?

Редактировать

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

Таким образом, в основном, я читаю весь файл слово за словом и добавляю каждое слово в словарь (а также номер строки конкретного слова), что дает мне следующую структуру:

lineNumber:word 

Например. 1:'Kontakt'

Теперь я пытаюсь использовать эту информацию, чтобы открыть другой файл и получить первое слово этого файла (в моем примере первое слово - @domain.com).

С помощью этого первого слова я хочу проверить, существует ли оно в моем словаре (первое вхождение). Если это так, я хочу вернуть номер строки. Так что в моем примере для слова @domain.com номер строки, который должен быть возвращен, будет 2.

0
oliverbj 25 Июн 2019 в 18:04

4 ответа

Лучший ответ

Вы можете создать функцию, как показано ниже. Это вернет первый соответствующий номер строки.

import re

input_dict = {
    0: {1: 'Kontakt'},
    1: {2: 'email@domain.com'},
    2: {3: 'domain.com'}
}

def search_word(regex):
    for k, v in input_dict.items():
        for _, v1 in v.items():
            if re.match(regex, v1):
                return k

print(search_word('domain.com')) # 2 (domain.com)
print(search_word('\w+@domain.com')) # 1 (email@domain.com)



Выход:

2
1
1
Praveenkumar 25 Июн 2019 в 16:20

Если вы действительно хотите найти в словаре динамическое значение, вам нужно перебрать элементы, проверить, совпадают ли значения, и вернуть ключ. Там нет никакого способа сделать это более питоническим способом.

for key, value in wordPos.items():
    for inner_key, inner_value in value.items():
        if value == string:
            return key

Если у вас уже есть массив слов, почему бы вам просто не использовать метод index?

if string in words:
   print(f"The string: {string}, exists. The key for this is: {words.index(string)}")

Если строка не существует, она вызывает ValueError, поэтому вы можете избежать if через:

try:
   print(f"The string: {string}, exists. The key for this is: {words.index(string)}")
except ValueError as e:
    pass
0
Jtcruthers 25 Июн 2019 в 15:36

Одна возможность - использовать встроенный модуль sqlite3 Python и полнотекстовый индекс FTS5:

import sqlite3

in_memory = sqlite3.connect(':memory:')
c = in_memory.cursor()
c.execute('CREATE VIRTUAL TABLE "ftsentry" USING FTS5 (line_no UNINDEXED, data, tokenize="unicode61 tokenchars \'.\'")')

c.execute("INSERT INTO ftsentry VALUES (?, ?)", (1, 'Kontakt'))
c.execute("INSERT INTO ftsentry VALUES (?, ?)", (2, 'email@domain.com'))
c.execute("INSERT INTO ftsentry VALUES (?, ?)", (3, 'domain.com'))
c.execute("INSERT INTO ftsentry VALUES (?, ?)", (4, 'domain@sample.com'))

l = [*c.execute('SELECT line_no, data FROM ftsentry WHERE data MATCH ? ORDER BY line_no ASC LIMIT 1', ('"@domain.com"', ))]
print(l)

l = [*c.execute('SELECT line_no, data FROM ftsentry WHERE data MATCH ?', ('"kontakt"', ))]
print(l)

Печать :

[(2, 'email@domain.com')]
[(1, 'Kontakt')]
0
Andrej Kesely 25 Июн 2019 в 15:44

Вам нужно перебрать значение значения (что редко бывает хорошей идеей),

string = "@domain.com"
for key, word in enumerate(d.values()):
    # We must here make the dict_values a list, and take the first index
    if string in list(word.values())[0]:  
        print("The string: {}, exists in the dictionary. The key for this is: {}".format(string, key))

Какой ужасный способ сделать это. Вероятно, есть гораздо лучшие способы, если вы просто можете объяснить, как выглядят полученные вами данные. :)

0
Gabriel Petersson 25 Июн 2019 в 15:46