J'ai un fichier avec 2 colonnes:

Anzegem             Anzegem
Gijzelbrechtegem    Anzegem
Ingooigem           Anzegem
Aalst               Sint-Truiden
Aalter              Aalter

La première colonne est une ville et la deuxième colonne est le district de cette ville.

J'ai fait un dictionnaire de ce fichier comme ceci:

def readTowns(text): 
    input = open(text, 'r')
    file = input.readlines()
    dict = {}
    verzameling = set()
    for line in file:
        tmp = line.split()
        dict[tmp[0]] = tmp[1]
    return dict

Si je définis une variable 'writeTowns' equal to readTowns(text) et que je fais writeTown['Anzegem'], je veux obtenir un collection of {'Anzegem', 'Gijzelbrechtegem', 'Ingooigem'}.

Est-ce que quelqu'un sait comment faire cela?

1
Dries Coppens 7 mars 2016 à 00:14

4 réponses

Meilleure réponse

Je pense que vous pouvez simplement créer une autre fonction qui peut créer une structure de données appropriée pour ce dont vous avez besoin. Parce qu'à la fin, vous finirez par écrire du code qui manipule essentiellement le dictionnaire renvoyé par readTowns pour générer des données selon vos besoins. Pourquoi ne pas garder le code propre et créer une autre fonction pour cela. Vous venez de créer un nom pour lister le dictionnaire et vous êtes prêt.

def writeTowns(text):
    input = open(text, 'r')
    file = input.readlines()
    dict = {}
    for line in file:
        tmp = line.split()
        dict[tmp[1]]  = dict.get(tmp[1]) or [] 
        dict.get(tmp[1]).append(tmp[0])
    return dict


writeTown = writeTowns('file.txt')
print writeTown['Anzegem']

Et si vous souhaitez lire deux fois le même fichier, vous pouvez également faire quelque chose comme ça,

def readTowns(text): 
    input = open(text, 'r')
    file = input.readlines()
    dict2town = {}
    town2dict = {}
    for line in file:
        tmp = line.split()
        dict2town[tmp[0]] = tmp[1]
        town2dict[tmp[1]]  = town2dict.get(tmp[1]) or [] 
        town2dict.get(tmp[1]).append(tmp[0])
    return dict2town, town2dict

dict2town, town2dict = readTowns('file.txt')
print town2dict['Anzegem']
1
Hossain Muctadir 6 mars 2016 à 21:33

Si vous créez votre dictionnaire en tant que {town: district}, donc la ville est la clé et le quartier est la valeur, vous ne pouvez pas le faire facilement *, car un dictionnaire n'est pas destiné à être utilisé de cette façon. Les dictionnaires vous permettent de trouver facilement les valeurs associées à une clé donnée. Donc, si vous voulez trouver toutes les villes d'un district, il vaut mieux construire votre dictionnaire comme:

{district: [list_of_towns]}

Ainsi, par exemple, le quartier Anzegem apparaîtrait comme {'Anzegem': ['Anzegem', 'Gijzelbrechtegem', 'Ingooigem']}

Et bien sûr, la valeur est votre collection.

* vous pourriez probablement le faire en parcourant tout le dict et en vérifiant où vos correspondances se produisent, mais ce n'est pas très efficace.

1
bignose 6 mars 2016 à 22:01

Vous pouvez faire quelque chose comme ça, bien que, s'il vous plaît jetez un œil à la réponse de @ ubadub, il existe de meilleures façons d'organiser vos données.

 [town for town, region in dic.items() if region == 'Anzegem']
1
Alex 6 mars 2016 à 21:23

On dirait que vous voulez faire un dictionnaire où les clés sont les quartiers et les valeurs sont une liste de villes. Une façon simple de le faire est:

def readTowns(text): 
    with open(text, 'r') as f:
        file = input.readlines()
        my_dict = {}
        for line in file:
            tmp = line.split()
            if tmp[1] in dict:
                my_dict[tmp[1]].append(tmp[0])
            else:
                my_dict[tmp[1]] = [tmp[0]]
    return dict

Les blocs if / else peuvent également être obtenus en utilisant la sous-classe defaultdict de python (docs ici) mais j'ai utilisé les instructions if / else ici pour plus de lisibilité.

Quelques autres points également: les variables dict et file sont des types python, donc c'est une mauvaise pratique de les écraser avec votre propre variable locale (remarquez que j'ai changé dict en {{X3} } dans le code ci-dessus.

1
bunji 6 mars 2016 à 21:27