我有字典:
{'Farage': [0, 5, 9, 192,233,341],
'EU': [0, 1, 5, 6, 9, 23]}
Query1: “Farage” and “EU”
Query2: “Farage” or “EU”
我需要返回包含这些查询的文档。例如,对于query1,答案应为[0,5,9]。 我相信答案应该是这样的,但是在python中:
final_list = []
while x≠Null and y≠Null
do if docID(x)=docID(y)
then ADD(final_list, docID(x))
x← next(x)
y ←next(y)
else if docID(x) < docID(y)
then x← next(x)
else y ←next(y)
return final_list
请帮助。
答案 0 :(得分:1)
您可以使用sets
创建自己的函数,该结构是Python提供的结构,可以通过加快joining和intersecting元素序列的处理来最适合您的情况:>
def getResults(s, argument):
s = list(s.values())
if argument == 'OR':
result = s[0]
for elem in s[1:]:
result = sorted(set(result).union(set(elem)))
return result
elif argument == 'AND':
result = s[0]
for elem in s[1:]:
result = sorted(set(result).intersection(set(elem)))
return result
else:
return None
inDict = {'Farage': [0, 5, 9, 192,233,341], 'EU': [0, 1, 5, 6, 9, 23]}
query1 = getResults(inDict, 'AND')
query2 = getResults(inDict, 'OR')
print(query1)
print(query2)
结果:
[0, 5, 9]
[0, 1, 5, 6, 9, 23, 192, 233, 341]
注意:如果您不想进行任何排序,则可以删除sorted
函数。
答案 1 :(得分:1)
您可以创建dict
个运算符,并进行set
个运算以获得最终结果。假设查询遵循key1 operator key2 operator key3
对于任意数量的参数
import operator
d1={'Farage': [0, 5, 9, 192,233,341],
'EU': [0, 1, 5, 6, 9, 23],
'hopeless': [0, 341, 19999]}
d={'and':operator.and_,
'or':operator.or_}
Queries= ['Farage and EU','Farage and EU or hopeless','Farage or EU']
for query in Queries:
res=set()
temp_arr = query.split()
k1 = temp_arr[0]
for value in range(1,len(temp_arr),2):
op = temp_arr[value]
k2 = temp_arr[value+1]
if res:
res = d[op](res, set(d1.get(k2, [])))
else:
res = d[op](set(d1.get(k1, [])), set(d1.get(k2, [])))
print(res)
输出
set([0, 9, 5])
set([0, 192, 5, 233, 9, 19999, 341])
set([0, 192, 5, 6, 1, 233, 23, 341, 9])
答案 2 :(得分:0)
请记住,请使用转换成组:
>>> d = {'Farage': [0, 5, 9, 192, 233, 341] , 'EU': [0, 1, 5, 6, 9, 23]}
>>> d
{'EU': [0, 1, 5, 6, 9, 23], 'Farage': [0, 5, 9, 192, 233, 341]}
>>>
>>> set(d['EU']) | set(d['Farage'])
{0, 1, 192, 5, 6, 9, 233, 341, 23}
>>>
>>> set(d['EU']) & set(d['Farage'])
{0, 9, 5}
>>>
>>> set(d['EU']) ^ set(d['Farage'])
{192, 1, 23, 233, 341, 6}
>>>
>>> set(d['EU']) - set(d['Farage'])
{1, 6, 23}
或者如果可能直接将字典设置为集合的形式,则更改输入的格式,即:
>>> d = {'Farage': {0, 5, 9, 192, 233, 341}, 'EU': {0, 1, 5, 6, 9, 23}}
>>> d['EU'] & d['Farage']
{0, 9, 5}