1
votes

Créer un acronyme pour chaque aéroport dans la liste Python?

Comment créer une nouvelle colonne et écrire des acronymes pour chaque enregistrement d'aéroport respectif en utilisant Python sur un fichier csv?

J'ai un fichier csv d'aéroports et je veux que les noms des aéroports soient sous forme d'acronyme donc que je peux les afficher sur une carte de manière plus compacte, avec le symbole de l'aéroport montrant ce que c'est.

Un exemple serait cet exemple de liste:

['Bradley Sky Ranch', ' Fire Island Airport ',' Palmer Municipal Airport ']

dans ceci: [' BSR ',' FIA ',' PMA ']

Ensuite, comment mettriez-vous le' ». ponctuation entre chaque acronyme?

Je pense que ce serait + "." + ou quelque chose avec ".".join?

Enfin, un avantage serait s'il y avait un moyen de se débarrasser du mot 'aéroport' de sorte que chaque acronyme ne se termine pas par «A»?

Par exemple, quelque chose comme .strip 'Airport' ... mais ce n'est pas l'objectif principal.

La liste numérotée ci-dessous montre des exemples de code I ont, mais je n'ai pas de solution cohérente. Alors s'il vous plaît ne prenez que ce qui a du sens, et si ce n'est pas le cas, j'aimerais apprendre une syntaxe plus efficace!

[Les données d'origine de l'aéroport proviennent de l'ESRI Living Atlas.] J'ai un nouveau champ / colonne appelé 'NameAbbrev' dans lequel je veux écrire les acronymes, mais je l'ai fait dans ArcPro qui contient essentiellement une interface de boîte noire pour calculer de nouveaux champs.

Sidenote: Pourquoi est-ce que je publie sur SO et pas GeoNet si c'est lié à la carte? Veuillez noter que mon objectif est d'utiliser python et je ne pose pas de questions sur ArcPy. Je pense que le principe sous-jacent est basé sur python pour fonctionner sur un fichier csv (alors qu'ArcPy fonctionnerait sur une classe de caractéristiques et que vous auriez à utiliser des fonctions désignées par ESRI). Et SO atteint un public plus large d'experts python.

1) Jusqu'à présent, j'ai découvert comment transformer une chaîne en un acronyme, ce qui fonctionne très bien sur une seule chaîne, pas sur une liste : Création d'acronymes en Python

def getAcronym():
filename = r'C:\Users\...\AZ_Airports_table.csv'
# Use with to make sure the file gets closed
with open(filename, "r") as readfile:
    # no need for readlines; the file is already an iterable of lines
    # also, using generator expressions means no extra copies
    airport = (line.split(",") for line in readfile)
    # iterate tuples, instead of two separate iterables, so no need for zip
    abbreviation = "".join(word[0] for word in airport.upper().split())
    # could also try    filter(str.isupper, line)
print(abbreviation)

getAcronym()

2 ) et a tenté de diviser les éléments dans une liste, ou comment faire des readlines sur un fichier csv basé sur un exemple (pas le mien): Erreur d'attribut: l'objet 'list' n'a pas d'attribut 'split'

with open(outCsv, 'wb') as ouputCsv:  
writer = csv.writer(outputCsv)  
writer.writerow(fields)  # writes header containing list of fields  
rows = arcpy.da.SearchCursor(fc, field_names=fields)  
for row in rows:  
    writer.writerow(row)  # writes fc contents to output csv  
del rows

3) Aussi, je ont pu utiliser des pandas pour imprimer uniquement la colonne des noms d'aéroports dans une liste:

import pandas
colnames = ['OBJECTID', 'POLYGON_ID', 'POLYGON_NM', 'NM_LANGCD', 'FEAT_TYPE', 'DETAIL_CTY', 'FEAT_COD', 'NAME_FIX', 'ORIG_FID', 'NameAbbrev']
data = pandas.read_csv(r'C:\Users\...\AZ_Airports_table.csv', names=colnames)

names = data.NAME_FIX.tolist()
print(names)

#Here is a sample of the list of airport names/print result.
#If you want a sample to demo guidance you could use these names:
#['NAME_FIX', 'Bradley Sky Ranch', 'Fire Island Airport', 'Palmer Municipal Airport', 'Kodiak Airport', 'Nome Airport', 'Kenai Municipal Airport', 'Iliamna Airport', 'Sitka Airport', 'Wrangell Airport', 'Sand Point Airport', 'Unalaska Airport', 'Adak Airport', 'Homer Airport', 'Cold Bay Airport']

4) J'ai également pu utiliser le curseur de recherche et le writerow dans le passé, mais je ne sais pas exactement comment appliquer ces méthodes. (exemple non lié):

def getQuakeData():
filename = input("Please enter the quake file: ")
# Use with to make sure the file gets closed
with open(filename, "r") as readfile:
    # no need for readlines; the file is already an iterable of lines
    # also, using generator expressions means no extra copies
    types = (line.split(",") for line in readfile)
    # iterate tuples, instead of two separate iterables, so no need for zip
    xys = ((type[1], type[2]) for type in types)
    for x, y in xys:
        print(x,y)

getQuakeData()

5) Donc, j'ai des pièces, mais je ne sais pas comment les assembler ou si elles s'emboîtent même. C'est mon monstre Frankenstein d'une solution, mais c'est faux car il essaie de regarder chaque colonne!

acronym = "".join(word[0] for word in test.upper().split())

Existe-t-il un moyen plus simple de combiner ces idées et d'obtenir le colonne d'acronyme que je veux? Ou existe-t-il un autre moyen?


1 commentaires

Chaque aéroport a au moins deux codes officiels de trois ou quatre caractères pour l'identification. Par exemple, pour l'aéroport municipal de Palmer, il s'agit du PAQ et du PAAQ. Pour les personnes ayant des connaissances en aviation, il sera au moins déroutant si vous utilisez d'autres codes.


3 Réponses :


0
votes

Je ne sais pas et je n'ai pas bien compris ce que vous voulez mais pour autant que je sache, vous souhaitez générer l ' acronyme de votre liste de chaînes avec le premier caractère de chaque mot. Alors qu'en est-il de ma solution ci-dessous avec quelques boucles? Vous pouvez utiliser list comprehension ou filter ou d'autres fonctions intéressantes de python pour obtenir ce que vous voulez. Faites-moi savoir si je manque quelque chose .

['B.S.R.', 'F.I.A.', 'P.M.A.']

Résultat:

input = ['Bradley Sky Ranch', 'Fire Island Airport', 'Palmer Municipal Airport']

output = []
for i in input:
    j =  i.split(' ')
    res = ''
    for k in j:
        res+= k[0] + '.'
    output.append(res)
print(output)  

p >


2 commentaires

@ElizabethMoore heureux que cela fonctionne. afin que vous puissiez l'accepter et le voter maintenant. Voir stackoverflow.com/help/someone-answers


>>> "" "Merci pour vos commentaires! Les votes exprimés par ceux qui ont moins de 15 points de réputation sont enregistrés, mais ne modifient pas le score affiché publiquement.



1
votes

Réponse la plus courte

Vous pouvez parcourir chaque chaîne de la liste, en utilisant une boucle for, puis vous pouvez ajouter chaque résultat à une nouvelle liste. Il peut être transformé en fonction si vous le souhaitez.

['B.S.R', 'F.I.A', 'P.M.A']

sortie

airports = ['Bradley Sky Ranch', 'Fire Island Airport', 'Palmer Municipal Airport']

air_acronyms = []
for airport in airports:
    words = airport.split()
    letters = [word[0] for word in words]
    air_acronyms.append(".".join(letters))

print(air_acronyms)


0 commentaires

1
votes

Cela peut être fait tout simplement en utilisant une compréhension de liste , str.join et filter :

>>> data = ['Bradley Sky Ranch', 'Fire Island Airport', 'Palmer Municipal Airport']
>>> ['.'.join(filter(str.isupper, name)) for name in data]
['B.S.R', 'F.I.A', 'P.M.A']


2 commentaires

Merci beaucoup, je l'apprécie vraiment!


Pas de problème @ElizabethMoore