在Python中匹配两组(/列表)

时间:2015-01-03 19:05:50

标签: python list csv set match

我有两套如下所示

设置A:

(['African American and Japanese', 'Indian', 'Chinese'])

设置B:

(['African', 'American', 'African American', 'Chinese', 'Russian'])

我希望输出为(['African American', 'Chinese'])但是我的脚本只给我中文或非洲,美国,中文(分裂非洲和美国,我知道我的脚本是如何,但我不知道如何编辑) 。

到目前为止我试过这个。

import csv
alist, blist = [], []
with open("sample.csv", "rb") as fileA:
    reader = csv.reader(fileA, delimiter=',')
    for row in reader:
        for row_str in row:
            alist.append(row_str)
            #alist = alist.strip().split() #If I use this, it also prints African, but doesn't print African American.
with open("ethnicity.csv", "rb") as fileB:
    reader = csv.reader(fileB, delimiter='\n')
    for row in reader:
        blist += row
        blist = [x.lower() for x in blist]
first_set = set(alist)
second_set = set(blist)
print [s for s in first_set if second_set in s]

编辑:

SetA中的元素并不总是用“和”分隔,它可以是其他任何东西,也可以只是一个空格。

2 个答案:

答案 0 :(得分:0)

您可以重新排列列表,即在列表项包含"and"作为子字符串时将其拆分 然后使用set的intersection方法从两个列表中获取常用项。

代码:

def convert(input):
    output = []
    for i in input:
        for j in i.split("and"):
            output.append(j.strip())
    return output

a = ['African American and Japanese', 'Indian', 'Chinese']
b = ['African American', 'Chinese']
a = convert(a)
print a
b = convert(b)
print set(a).intersection(set(b))

输出:

set(['African American', 'Chinese'])

这有用吗?

答案 1 :(得分:0)

如果它可以任何字符串(包括空格)分隔单词,你可以这样做:

import re
sep = ' ; '
_a = sep.join(re.split(' [a-z]* ', sep.join(a)))
_b = sep.join(re.split(' [a-z]* ', sep.join(b)))
set(_b.split(sep)).intersection(_a.split(sep))

;将您的列表中的两个单词分开时,它无法正常工作...但我认为它确实可以处理所有情况,当您拥有非负载式字词分隔符时。