LINUX.ORG.RU

Простенький вопрос по работе со строками в Python

 ,


1

2

Добрый день,

Я имею csv файл следующего вида:

asdf@gmail.com;username1 sadfa@mail.ru;username2 asdfaasdfas@gmail.com;username3 asdsafsdfas@mail.ru;username4 zxcvzcx@yandex.ru;username5 xcvfdg@yamdex.ru;username6

Мне нужно сделать из него список, содержащий группы кортежа, с неповторяющимися доменами.

Для начала я решил сделать словарь, где ключом будет доменная зона, но у меня теряются ключи. Как мне написать правильно?

Код — http://paste.ee/p/6mqe1.

То, что я получаю в итоге: {'mail.ru': 'username4', 'yamdex.ru': 'username6', 'gmail.com': 'username3', 'yandex.ru': 'username5'}



Последнее исправление: true_admin (всего исправлений: 2)

Кто тебе мешает хранить в словаре {'domain', {'mail', 'user'}} ?

anonymous
()

В лоб:

import csv
 
reader = csv.reader(open('test7.csv'))
users_dict = {}
 
for row in reader:
    mail, nick = row.split(';')
    address, domain = mail.split('@')
    if domain not in users_dict:
        users_dict[domain] = {}
    users_dict[domain][address] = nick
print(users_dict)

baldman88
()

Теряются значения

Если на выходе ты хочешь получить пользователей, сгруппированных по доменным адресам их почт, то есть:

{
'mail.ru': ['username2', 'username4'],
'yamdex.ru': ['username6'], 
'gmail.com': ['username1', 'username3'], 
'yandex.ru': ['username5']
}

То тебе нужно для каждого домена создавать список и добавлять новых пользователей к этому списку, поскольку одному ключу может соответствовать только одно значение. То есть код будет выглядеть как-то так.

А вот это

список, содержащий группы кортежа, с неповторяющимися доменами

Я не распарсил.

grazor ★★
()

123

asdf@gmail.com;username1 sadfa@mail.ru;username2 asdfaasdfas@gmail.com;username3 asdsafsdfas@mail.ru;username4 zxcvzcx@yandex.ru;username5 xcvfdg@yamdex.ru;username6

Ryofu

Siado ★★★★★
()

Мне нужно сделать из него список, содержащий группы кортежа, с неповторяющимися доменами.

Это как? Ключом словаря у тебя домен должен быть? Это я понял. А значения какие? Сопоставление адреса и имени юзера? Тогда у тебя значением должен быть тоже словарь, то есть, что-то типа:

{'yamdex.ru': {'username6': 'xcvfdg@yamdex.ru'}, 'yandex.ru': {'username5': 'zxcvzcx@yandex.ru'}, 'mail.ru': {'username4': 'asdsafsdfas@mail.ru', 'username2': 'sadfa@mail.ru'}, 'gmail.com': {'username3': 'asdfaasdfas@gmail.com', 'username1': 'asdf@gmail.com'}}
?

Тогда как-то так:

from collections import defaultdict

import csv

reader = csv.reader(open('test7.csv'))

users = defaultdict(dict)
for row in reader:
    address, username = row.split(";")
    domain = address.split("@")[1]
    users[domain][username] = address

print(users_dict)

Psych218 ★★★★★
()
Ответ на: комментарий от Psych218

Если же хранить адрес мыла не нужно, а только домен и все юзернеймы, с ним связанные (похоже на то вроде по тому, что пытался и как сформулировал), то есть, так:

{'gmail.com': ['username1', 'username3'], 'mail.ru': ['username2', 'username4'], 'yamdex.ru': ['username6'], 'yandex.ru': ['username5']}
То ещё чуть проще:
from collections import defaultdict

import csv

reader = csv.reader(open('test7.csv'))

users = defaultdict(list)
for row in reader:
    domain, username = row.split("@")[1].split(";")
    users[domain].append(username)

print(users)

P.S. В прошлом сообщении в последней строке ошибка в имени переменной, должно быть users.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 1)

Очень знакомая задача. Я на нее натыкался то ли на собеседовании, то ли на каких-то курсах по питону, которые проходила жена.

gnunixon ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.