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
变得非常大(比如数百万),我觉得肯定有比2for循环更快的东西。在
代码所做的是获取一个字典列表,并对每个字典的值运行一个奇特的模糊匹配函数。所以这并不像把所有的字典和其他的字典比较那么简单。我想在每个字典上运行一个函数,也许2个for循环是正确的方法吗?任何建议都会有帮助的!在
您可以使用^{} ,它本质上是同一个双循环,但它的迭代速度更快,因为它是用C编写的(这只会减少常量因子,您仍然具有
O(n**2)
运行时行为),并且不再需要if person1['pid'] >= person2['pid']: continue
(它已经内置在combinations
函数中)。在哪个打印:
^{pr2}$但是,如果您的
fancymatching
允许它,那么您也可以对您的值进行分组(O(n)
运行时)。例如,在您的例子中,您只匹配相同的'fname'
-值。在但是只有当你的
fancymatching
允许这样的分组时,这才是可能的。这对你的情况来说是正确的,但如果事情更复杂,可能就不是了。在再加上MSeifert的答案,如果您的匹配依赖于fname1==fname2,那么您可以对列表进行排序并分组:即:
显然,如果您更改匹配函数,您将需要更改键函数,以便它为匹配的任何元素返回相同的值,并为不匹配的任何元素返回不同的值。这取决于这样一个事实:这样的键函数存在,而对于任意匹配函数,情况并非总是如此。在
相关问题 更多 >
编程相关推荐