Делаете аббревиатуру для каждого аэропорта в списке Python? - PullRequest
1 голос
/ 16 марта 2019

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

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

Примером может служить следующий пример:

['Bradley Sky Ranch',«Аэропорт острова огня», «Муниципальный аэропорт Палмера»]

в это: ['BSR', 'FIA', 'PMA']

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

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

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

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

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

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

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

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

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

2) и попытка разбить элементы в списке, или как выполнить readlines для файла 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) Кроме того, я смог использовать панд для распечатки только списка названий аэропортов в список:

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

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

Ответы [ 3 ]

1 голос
/ 16 марта 2019

Это можно сделать довольно просто, используя список , 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']
0 голосов
/ 16 марта 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']
0 голосов
/ 16 марта 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.']
...