Потрібно знайти рядки, які містять одне й те саме слово двічі


10

У мене є дані атрибутів з іменами власників. Мені потрібно вибрати дані, які містять прізвище двічі .

Наприклад, у мене може бути ім'я власника, який пише " BENNETT MCCARL & ARNETTE BENNETT ".

Я хотів би вибрати будь-які рядки в таблиці атрибутів, які мають повторне прізвище, наприклад, наведений вище приклад. Хтось знає, як я можу йти про вибір цих даних?


Який ГІС ви використовуєте? Чи є Python варіантом?
Аарон

3
Це стосується питання Python, на який, я думаю, ви знайдете код Python, дослідивши / задавши запит на переповнення стека .
PolyGeo

1
Це список прізвищ або двоє людей, одного на ім'я Беннет Маккарл та іншого Арнетта Беннетта? Здається, одна людина має прізвище Беннетта, а інша - прізвище Беннетта?
Аарон

1
Для цього я думаю, що вам потрібно порахувати унікальні слова у вашому рядку, і якщо вона менша за кількість слів у вашому рядку, то принаймні одне слово дублюється. Розрізнення слів, які є або можуть бути прізвищами від інших слів, буде окремою вправою. Я думаю, ви повинні відредагувати своє запитання тут, щоб зробити ваші точні вимоги зрозумілішими, і поєднати це з дослідженням Python в Stack Overflow .
PolyGeo

1
Я переглянув ваше запитання на сайті stackoverflow.com/questions/35165648/…, оскільки воно було висловлене в "ArcGIS-говоріть", а не в "Python-speak". Сподіваємось, він не отримає занадто багато зворотних каналів під час очікування затвердження моєї редакції.
PolyGeo

Відповіді:


2

Вираження поля калькулятора на основі цієї відповіді

def cw(sentence):
 words = sentence.split()
 counts = {}
 nMax=0
 for word in words:
    if word not in counts:counts[word] = 0
    counts[word] += 1
    nMax=max(nMax, counts[word])
 return nMax

'==================================================== =

cw( !MUID!)

Він поверне максимальну кількість однакових слів у рядку


8

Для цього можна використовувати модуль колекцій Python та курсор оновлення. Цей метод додає нове поле і заповнює його, 1якщо є дублікати, інакше a, 0якщо немає дублікатів.

import arcpy, collections

shp = r'C:\temp\names.shp'

# Add a field called "check" to store binary data.

arcpy.AddField_management(shp, field_name = "check", field_type = "SHORT")

# Use an Update Cursor to query the table and write to new rows
# 1 = has duplicates
# 0 = no duplicates
with arcpy.da.UpdateCursor(shp, ["last_names", "check"]) as cursor:
    for row in cursor:
        names = row[0].replace("&", "").split() # Clean the string
        counts = collections.Counter(names) #create dictionary to count occurrences of words
        if any(x > 1 for x in list([count for name, count in counts.items()])):
            row[1] = 1
        else:
            row[1] = 0
        cursor.updateRow(row)

введіть тут опис зображення


1
Приємно використовувати цей модуль колекцій, ніколи не знав, що він існує. Я думав у тих же рядках, але використовував регулярні вирази, щоб витягнути слова, що повторюються, щоб створити поле прапора. Я думаю, що ваш підхід із використанням функції лічильника набагато простіше зрозуміти. Я перевіряю цей модуль пізніше!
Hornbydd

6

А що стосується використання reта setвстановлення прапора (тут 0 і 1) у python- reвитягуватиме всі імена (останнє та перше) BENNETT MCCARL & ARNETTE BENNETTззовні &. Для відповідності шаблонів reє найвищим пріоритетом - ви можете використовувати reяк хочете.

import re
def sorter(val):
    words = re.findall(r'\w+',val)
    uniques = set(words)
    if len(words)>len(uniques):
        return 1
    else:
        return 0

І дзвоніть sorter( !N! )


демонстрація


** Подивіться, як regexхапає слова наLIVE DEMO

Зауважте, що всі ці відповіді вирішують проблему, припускаючи, що ваші дані санітируються, тобто є належний простір між словами, але що робити, якщо ваші дані щось подібне, BENNETTMCCARL&ARNETTEBENNETTто все це не вдасться. У цьому випадку вам може знадобитися використовувати алгоритм Suffix Tree , і, на щастя, python має деяку бібліотеку, як тут .


регекс на допомогу, приємно!
Hornbydd

2

Якщо припустити, що вихідні дані є FeatureClass / Таблиця у файлі GeoDatabase, то наступний запит вибере потрібні рядки:

SUBSTRING(name FROM 1 FOR 7) = 'BENNETT' AND SUBSTRING(name FROM (CHAR_LENGTH(name) - 6) FOR 7) = 'BENNETT

nameце поле, я просто випадково його назвав name. Перша частина - це тестування лівої сторони, друга частина - тестування правої. Цей запит, очевидно, важко закодований для пошуку BENNETT, якщо вам потрібно вибрати інші прізвища, сподіваємось, ви зможете розібратися, що потребує змін?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.