使用一个单词数组来过滤第二个数组中的单词

时间:2012-01-30 21:16:15

标签: python filtering

我在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

6 个答案:

答案 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_strstop_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'}