def fancymatching(fname1, fname2):
#This function will do much smarter and fancy kinds of compares
if (fname1 == fname2):
return 1
else:
return 0
personlist = [
{
'pid':'1',
'fname':'john',
'mname':'a',
'lname':'smyth',
},{
'pid':'2',
'fname':'john',
'mnane':'a',
'lname':'smith',
},{
'pid':'3',
'fname':'bob',
'mname':'b',
'lname':'nope',
}
]
for person1 in personlist:
for person2 in personlist:
if person1['pid'] >= person2['pid']:
#don't check yourself, or ones that have been
continue
if fancymatching(person1['fname'], person2['fname']):
print (person1['pid'] + " matched " + person2['pid'])
Я пытаюсь улучшить идею вышеуказанного кода. Он работает, но если personlist
становится очень большим (скажем, миллионы), я чувствую, что для циклов должно быть что-то быстрее, чем 2.Python - что-то быстрее, чем 2 вложенных для петель
Что делает код, это перечислить список словарей и запустить функцию fancy fuzzzy matching, соответствующую значениям каждого словаря по отношению друг к другу. Так что это не так просто, как просто сравнение всех словарей с другими. Я бы хотел, чтобы запустить функцию в каждом словаре, возможно, 2 для циклов - это правильный способ сделать это? Любые предложения будут полезны!
Если ничего не известно о нечетком совпадении, вы не можете сделать это быстрее, чем вложенные циклы (вы можете, однако, увеличить его с помощью 2x, если ваш второй цикл начнет повторяться со следующего «person1». Таким образом, если '(a, b) 'оценивается' (b, a) 'не оценивается. Является ли сопоставление каким-то транзитивным? –
Использование' itertools.combinations' может быть немного быстрее, чем выписывать ваши собственные циклы, но не на большом количестве (то же самое, O (N ** 2) 'асимптотическая производительность. – Blckknght