1

我有以下列表:

list1 = ['john mayer', 'elizabeth taylor', 'steven barber','jennifer richards']
list2 = ['john','jennifer']

我想比较 list1 和 list2 并返回 TRUE,因为名字匹配。我知道如果 list2 中的全名可用,我可以通过使用集合交集来完成这项工作。但事实并非如此。是否有设置交集的正则表达式匹配版本

编辑:是的,上面例子的结果应该是真的如果我有一个 list3

list3 = ['jack','jennifer']
list1-list2 : TRUE
list2-list3 : FALSE

EDIT2:我想我在原来的帖子中不是很清楚。在 list2 或 list3 我可以有名字和全名的组合

list4 = ['john mayer', 'jennifer']
list1-list4 : TRUE
4

5 回答 5

1

list1您可以像这样制作一组名字

>>> {x.split()[0] for x in list1}
set(['john', 'jennifer', 'elizabeth', 'steven'])

您可以像这样进行各种设置操作

>>> list2 = ['john','jennifer']
>>> set(list2).difference(x.split()[0] for x in list1)
set([])        # ie False
>>> list3 = ['jack','jennifer']
>>> set(list3).difference(x.split()[0] for x in list1)
set(['jack'])  # ie True

如果你真的需要布尔...

>>> bool(set(list2).difference(x.split()[0] for x in list1))
False
>>> bool(set(list3).difference(x.split()[0] for x in list1))
True

或相反...

>>> bool(not set(list2).difference(x.split()[0] for x in list1))
True
>>> bool(not set(list3).difference(x.split()[0] for x in list1))
False

对于新的 list4 测试用例

>>> list4 = ['john mayer', 'jennifer']
>>> {x.split()[0] for x in list1}.union(list1) > set(list2)
True
>>> {x.split()[0] for x in list1}.union(list1) > set(list3)
False
>>> {x.split()[0] for x in list2}.union(list2) > set(list3)
False
>>> {x.split()[0] for x in list1}.union(list1) > set(list4)
True
于 2012-04-11T03:45:31.503 回答
1
>>> set(list2).issubset(ele.split(' ')[0] for ele in list1)
True

由于 jamylak 提出的观点,我删除了 [.] ,就像我在原始帖子中所做的那样。

于 2012-04-11T03:50:37.590 回答
1
def first_name_is_in(first_names, full_names):
    for name in first_names:
        for full_name in full_names:
            if full_name.startswith("%s " % (name,)):
               return True
    return False
于 2012-04-11T03:36:49.057 回答
0
full_names = ['john mayer', 'elizabeth taylor', 'steven barber','jennifer richards']
first_names = ['john','jennifer']

all((any(full.split()[0]==first for full in full_names) for first in first_names))
于 2012-04-11T03:35:56.883 回答
0

正如@gnibbler 建议的那样,最好制作一套,所以我已经改变了我的使用它。

>>> first_names = {name.split()[0] for name in list1}
>>> all(x in first_names for x in list2)
True
于 2012-04-11T03:41:09.247 回答