10 votos

Necesidad de encontrar cadenas que contienen la misma palabra dos veces

Tengo datos de los atributos con nombres de propietario. Necesito seleccionar los datos que contiene el último nombre dos veces.

Por ejemplo, yo puedo tener un nombre de propietario que lee "BENNETT MCCARL y ARNETTE BENNETT".

Me gustaría seleccionar ninguna fila en la tabla de atributos que tienen un apellido recurrente como en el ejemplo anterior. ¿Alguien sabe cómo puedo hacer para seleccionar datos?

8voto

Aaron Puntos 25882

Usted puede utilizar el Python colecciones módulo y una Actualización del Cursor para lograr esto. Este método agrega un nuevo campo y se rellena con una 1 si hay duplicados, de lo contrario un 0 si no hay duplicados.

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)

enter image description here

6voto

Muxa Puntos 2425

¿Qué acerca del uso re y set y la configuración de una bandera ( de aquí el 0 y el 1) en python- re extraerá todos los nombres (primera y última) de BENNETT MCCARL & ARNETTE BENNETT sin &. Por la coincidencia de patrón re es de la más alta prioridad - se puede usar re cómo desea.

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

Y llame a sorter( !N! )


demo


Ver cómo regex las apropiaciones de las palabras en la DEMOSTRACIÓN en VIVO

Tenga en cuenta que todas estas respuestas tratar el problema suponiendo que los datos se desinfecta es decir, tener un adecuado espacio entre las palabras , pero ¿y si sus datos son algo como BENNETTMCCARL&ARNETTEBENNETT , a continuación, todos estos sería un fracaso. En ese caso, puede que necesite utilizar el Sufijo Árbol de algoritmo y, afortunadamente, python tiene alguna biblioteca como aquí.

2voto

FelixIP Puntos 4035

Expresión de campo calculadora basada en esta respuesta

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

Devuelve el número máximo de palabras en la cadena de

2voto

John Kramlich Puntos 286

Suponiendo que los datos de origen es que un FeatureClass/mesa en una GeoDatabase de archivos luego en la siguiente consulta seleccionará las filas que necesite:

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

namees el campo, pasó a llamarlo name . La primera parte prueba el lado izquierdo la segunda parte es prueba de la derecha. Esta consulta es obviamente difícil codificado para buscar BENNETT, si desea seleccionar otros apellidos que puede elaborar lo que necesita cambiar?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X