我在Python中比较两个数组。
第一个数组是查询字符串中的单词列表。第二个数组是要从查询中排除的单词列表。
我必须比较这些数组并排除第一个数组中包含在第二个数组中的单词。
我试图通过将第一个数组中的每个单词与第二个数组的整个单词进行比较来继续解决这个问题,直到第一个数组中的所有单词都用尽为止:
for i in q_str:
if q_str[i] in stop_arr:
continue
else:
sans_arr[j] = q_arr[i]
j = j + 1
q_str
是查询数组,stop_arr
包含要排除的字词,以及
sans_arr
是一个包含排除字词的新数组。
此代码生成错误:
列表索引必须是整数而不是str
答案 0 :(得分:9)
使用集合代替列表,可以轻松访问集合操作,例如减法:
set1 = set(q_str)
set2 = set(stop_arr)
set3 = set1 - set2 # things which are in set1, but not in set2
# or
set4 = set1.difference(set2) # things which are in set1, but not in set2
以下是一个例子:
>>> u = set([1,2,3,4])
>>> v = set([3,4,5,6])
>>> u - v
set([1, 2])
>>> u.difference(v)
set([1, 2])
>>> v.difference(u)
set([5, 6])
答案 1 :(得分:2)
您是否希望保留q_str
中单词的顺序并不完全清楚。如果你这样做:
import re
q_str = 'I am comparing 2 arrays in python. both are character arrays. the 1st array is a list of words from a query string. the second array is the list of words to be excluded from the query.'
q_arr = re.split(r'[\s.,;]+', q_str)
stop_arr = set(['a', 'the', 'of', 'is', 'in', 'to', 'be', 'am', 'are', ''])
print [w for w in q_arr if w not in stop_arr]
这会产生:
['I', 'comparing', '2', 'arrays', 'python', 'both', 'character', 'arrays', '1st',
'array', 'list', 'words', 'from', 'query', 'string', 'second', 'array', 'list',
'words', 'excluded', 'from', 'query']
答案 2 :(得分:1)
此代码生成的新数组包含q_str
中不存在的stop_arr
所有元素:
sans_arr = [ x for x in q_str if x not in stop_arr ]
免责声明:我不知道q_str是否是一个字符串数组,因为你谈论的是一个查询数组。
答案 3 :(得分:0)
'for q in q_str'遍历循环中的列表,每次返回一个字符串。
我会在你的循环中失去[i]
for word in q_str:
if word in stop_arr:
continue
else:
sans_arr[j] = word
j=j+1
答案 4 :(得分:0)
当您使用for循环遍历列表时,您将获得列表的元素,而不是索引。这意味着i
实际上是来自q_str
的字符串,因此您可以检查if q_str[i] in stop_arr
而不是if i in stop_arr
。这也意味着您要将i
添加到sans_arr
而不是q_arr[i]
。
此外,除非sans_arr
已经创建了一定长度,否则您可能希望执行sans_arr.append(i)
而不是当前在特定索引处设置元素然后递增当前索引的方法。
由于i
对于索引比对单词更有意义,因此我已将循环中的i
重命名为word
:
for word in q_str:
if word in stop_arr:
continue
else:
sans_arr.append(word)
答案 5 :(得分:0)
我认为q_str
是查询字符串中键值对的字典,stop_arr
是一个包含您不想要的键的列表,sans_arr
已被过滤q_str
,stop_arr
中没有密钥。
根据上述假设,解决方案如下所示:
sans_arr = {x: q_str[x] for x in q_str if x not in stop_arr}
这是它的工作原理:
>>> q_str = {
'test1': 'val1',
'test2': 'val2',
'test3': 'val3'
}
>>> stop_arr = ['test3','test4']
>>> sans_arr = {x: q_str[x] for x in q_str if x not in stop_arr}
>>> sans_arr
{'test1': 'val1', 'test2': 'val2'}