使用Python中的Intersection比较两组数据

时间:2016-11-08 04:03:54

标签: python set set-intersection

当比较两个集合following_id和follower_id时,返回结果似乎是在分割所有内容。

import re
id1 = '[User(ID=1234567890, ScreenName=RandomNameHere), User(ID=233323490,      ScreenName=AnotherRandomName), User(ID=4459284, ScreenName=YetAnotherName)]'
id2 = '[User(ID=1234467890, ScreenName=sdf), User(ID=233323490,  ScreenName=AnotherRandomName), User(ID=342, ScreenName=443)]'

following_id = ', '.join( re.findall(r'ID=(\d+)', id1) )
follower_id = ', '.join( re.findall(r'ID=(\d+)', id2) )

a = list(set(following_id).intersection(follower_id))
print a

此结果为[' ', ',', '1', '0', '3', '2', '5', '4', '7', '6', '9', '8']

我希望结果为['233323490','54321'],这两个ID是两个匹配的。

以下适用于我:

list1 = [1234567890, 233323490, 4459284, 230, 200, 234, 200, 0002]
list2 = [1234467890, 233323490, 342, 101, 234]
a = list(set(list1).intersection(list2))
print a

结果为[233323490, 234]

这是否与following_id和follower_id的数据类型有关?

2 个答案:

答案 0 :(得分:1)

这是因为您使用strings制作.join,而不是lists

following_id = ', '.join( re.findall(r'ID=(\d+)', id1) )
follower_id = ', '.join( re.findall(r'ID=(\d+)', id2) )
print(following_id) # '1234567890, 233323490, 4459284'
print(follower_id) # '1234467890, 233323490, 342'

你只需要使用:

following_id = re.findall(r'ID=(\d+)', id1)
follower_id = re.findall(r'ID=(\d+)', id2)

由于re.findall已经返回list个匹配项。

答案 1 :(得分:0)

following_idfollower_id是字符串。将字符串转换为集合时,您将获得一组每个字符:

>>> set('hello, there')
{' ', 'o', 't', 'e', 'r', 'h', ',', 'l'}

在创建集合时,Python并不关心字符串中的逗号或空格......它只是迭代将每个字符视为新集合中的项目。

您正在寻找一组字符串。所以你需要传递包含字符串的东西然后变成一个集合。 re.findall应该会给你一个字符串列表。如果你不将它们连在一起,你应该能够走上十字路口并获得你想要的东西:

following_id = re.findall(r'ID=(\d+)', id1)
follower_id = re.findall(r'ID=(\d+)', id2)

a = list(set(following_id).intersection(follower_id))