Сделать аббревиатуру для каждого аэропорта в списке Python?

Как создать новый столбец и написать акронимы для каждой соответствующей записи аэропорта, используя Python в файле csv?

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

Примером может служить этот образец списка:

['Ранчо Брэдли Скай', 'Аэропорт Файер-Айленда', 'Муниципальный аэропорт Палмера']

в это: ['B.S.R', 'FIA', 'P.M.A.']

Далее, как бы вы поставили '.' точка пунктуация между каждой буквой аббревиатуры?

Я думаю, это будет + "." + или что-то с ".".join?

Наконец, было бы полезно, если бы был способ избавиться от слова «аэропорт», чтобы каждая аббревиатура не заканчивалась на «А»?

Например, что-то вроде .strip "Аэропорт"... но это не основная цель.

В пронумерованном списке ниже показаны примеры кода, который у меня есть, но у меня нет последовательного решения. Поэтому, пожалуйста, берите только то, что имеет смысл, а если нет, то я хотел бы изучить более эффективный синтаксис!

[Исходные данные об аэропорте взяты из ESRI Living Atlas.] У меня есть новое поле/столбец под названием «NameAbbrev», в которое я хочу записать аббревиатуры, но я сделал это в ArcPro, который по сути содержит интерфейс «черный ящик» для расчета новых поля.

Примечание: почему я размещаю сообщения в SO, а не в GeoNet, если это связано с картой? Обратите внимание, что моя цель — использовать python, и я не спрашиваю об ArcPy. Я думаю, что базовый принцип основан на Python для работы с файлом csv (тогда как ArcPy будет работать с классом объектов, и вам придется использовать функции, назначенные ESRI). И SO достигает более широкой аудитории экспертов по Python.

1) До сих пор я сталкивался с тем, как превратить строку в аббревиатуру, которая отлично работает с одной строкой, а не со списком: Создание акронимов в Python

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

2) и попытался разделить элементы в списке или как сделать строки чтения в файле csv на основе примера (не моего): Ошибка атрибута: объект 'list' не имеет атрибута 'split'

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()

3) Кроме того, я смог использовать pandas, чтобы распечатать только столбец имен аэропортов в списке:

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) Я также мог использовать курсор поиска и строку записи в прошлом, но я не знаю, как именно применять эти методы. (несвязанный пример):

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

5) Итак, у меня есть кусочки, но я не знаю, как их собрать и подходят ли они друг к другу. Это мой монстр Франкенштейна решения, но он неправильный, потому что пытается посмотреть на каждый столбец!

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()

Есть ли более простой способ объединить эти идеи и получить столбец с аббревиатурой, который я хочу? Или есть альтернативный способ?


person Elizabeth Moore    schedule 16.03.2019    source источник
comment
В каждом аэропорту есть как минимум два официальных трех- или четырехзначных кода для идентификации. Например, для муниципального аэропорта Палмера это PAQ и PAAQ. Людям с некоторыми познаниями в авиации будет как минимум запутанно, если вы будете использовать другие коды.   -  person Klaus D.    schedule 16.03.2019


Ответы (3)


Это можно сделать очень просто, используя понимание списка, str.join и 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']
person Christian Dean    schedule 16.03.2019
comment
Большое спасибо, я очень ценю это! - person Elizabeth Moore; 19.03.2019
comment
Нет проблем @Элизабет Мур - person Christian Dean; 19.03.2019

Самый короткий ответ

Вы можете перебирать каждую строку в списке с помощью цикла for, а затем добавлять каждый результат в новый список. При желании его можно превратить в функцию.

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)

вывод

['B.S.R', 'F.I.A', 'P.M.A']
person Enrique Bruzual    schedule 16.03.2019

Я не знаю и на самом деле неправильно понял, что вы хотите, но, насколько я понимаю, вы хотите сгенерировать аббревиатуру вашего списка строк с первым символом каждого слова. Итак, как насчет моего приведенного ниже решения с парой циклов? Вы можете использовать list comprehension или filter или другие классные функции Python, чтобы достичь того, чего вы хотите в дальнейшем. Сообщите мне, если я что-то пропущу.

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)  

Вывод:

['B.S.R.', 'F.I.A.', 'P.M.A.']
person Always Sunny    schedule 16.03.2019
comment
@ElizabethMoore рада, что это работает. так что вы можете принять и проголосовать за него сейчас. См. stackoverflow.com/help/someone-answers. - person Always Sunny; 19.03.2019
comment
>>> Спасибо за ответ! Голоса, отданные теми, у кого репутация менее 15, записываются, но не изменяют публично отображаемый результат публикации. - person Elizabeth Moore; 25.03.2019