2014-10-17 2 views
0

У меня есть словарь, как это:Количество уникальных значений для каждого уникальных ключей в словаре питона

yahoo.com|98.136.48.100 
yahoo.com|98.136.48.105 
yahoo.com|98.136.48.110 
yahoo.com|98.136.48.114 
yahoo.com|98.136.48.66 
yahoo.com|98.136.48.71 
yahoo.com|98.136.48.73 
yahoo.com|98.136.48.75 
yahoo.net|98.136.48.100 
g03.msg.vcs0|98.136.48.105 

, в котором у меня есть повторяющиеся ключи и значения. И то, что я хочу, - это окончательный словарь с уникальными ключами (ips) и количеством уникальных значений (домены). У меня есть подкатегория:

for dirpath, dirs, files in os.walk(path): 
    for filename in fnmatch.filter(files, '*.txt'): 
     with open(os.path.join(dirpath, filename)) as f: 
      for line in f: 
       if line.startswith('.'): 
        ip = line.split('|',1)[1].strip('\n') 
        semi_domain = (line.rsplit('|',1)[0]).split('.',1)[1] 
        d[ip]= semi_domains 
        if ip not in d: 
         key = ip 
         val = [semi_domain] 
         domains_per_ip[key]= val 

, но это не работает должным образом. Может ли кто-нибудь помочь мне с этим?

+0

почему вы используете 'StartsWith ('')'? – Kasramvd

+1

Что значит «повторяющиеся ключи» *? Ключи в словарях уже уникальны. – jonrsharpe

ответ

0

Используйте defaultdict:

from collections import defaultdict 

d = defaultdict(set) 

with open('somefile.txt') as thefile: 
    for line in the_file: 
     if line.strip(): 
      value, key = line.split('|') 
      d[key].add(value) 

for k,v in d.iteritems(): # use d.items() in Python3 
    print('{} - {}'.format(k, len(v))) 
+0

Спасибо @Burhan Халид, он решил мою проблему – Ounk

0

вы можете использовать zip функцию, чтобы отделить ips и domains в списке буксировки, а затем использовать set, чтобы получить уникальные записи!

>>>f=open('words.txt','r').readlines() 
>>> zip(*[i.split('|') for i in f]) 
[('yahoo.com', 'yahoo.com', 'yahoo.com', 'yahoo.com', 'yahoo.com', 'yahoo.com', 'yahoo.com', 'yahoo.com', 'yahoo.net', 'g03.msg.vcs0'), ('98.136.48.100\n', '98.136.48.105\n', '98.136.48.110\n', '98.136.48.114\n', '98.136.48.66\n', '98.136.48.71\n', '98.136.48.73\n', '98.136.48.75\n', '98.136.48.100\n', '98.136.48.105')] 
>>> [set(dom) for dom in zip(*[i.split('|') for i in f])] 
[set(['yahoo.com', 'g03.msg.vcs0', 'yahoo.net']), set(['98.136.48.71\n', '98.136.48.105\n', '98.136.48.100\n', '98.136.48.105', '98.136.48.114\n', '98.136.48.110\n', '98.136.48.73\n', '98.136.48.66\n', '98.136.48.75\n'])] 

, а затем с len вы можете найти количество уникальных объектов! все в одной строке с пониманием списка:

>>> [len(i) for i in [set(dom) for dom in zip(*[i.split('|') for i in f])]] 
[3, 9] 
Смежные вопросы