2016-11-08 3 views
0

При сравнении двух наборов next_id и follower_id результат возврата, кажется, разбивает все.Сравнение двух наборов данных с перекрестным соединением в Python

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'], которые являются двумя идентификаторами, которые соответствуют между двумя наборами.

следующие работы для меня:

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?

+1

''. '. Join() 'будет возвращать одну строку. Может быть, если вы удалите это в определении 'follow_id' и' follower_id', в конце концов, вам нужны эти два списка для поиска пересечения? 're.findall()' уже возвращает список – TuanDT

+0

@ Tuan333 Имеет смысл, спасибо за быстрый ответ. – New

ответ

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 спичек.

+0

Быстрый ответ! В этом есть смысл. Спасибо. – New

0

following_id и follower_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)) 
+0

Отличное объяснение !! – New

Смежные вопросы