Cần tìm các chuỗi chứa cùng một từ hai lần


10

Tôi có dữ liệu thuộc tính với tên chủ sở hữu. Tôi cần chọn dữ liệu chứa tên cuối cùng hai lần .

Ví dụ: tôi có thể có tên chủ sở hữu là " BENNETT MCCARL & ARNETTE BENNETT ".

Tôi muốn chọn bất kỳ hàng nào trong bảng thuộc tính có họ cuối cùng như ví dụ ở trên. Có ai biết làm thế nào tôi có thể đi về việc chọn dữ liệu đó?


Bạn đang sử dụng hệ thống GIS nào? Python có phải là một lựa chọn không?
Aaron

3
Điều này chắt lọc một câu hỏi Python mà tôi nghĩ rằng bạn sẽ tìm thấy mã Python cho bằng cách nghiên cứu / hỏi về Stack Overflow .
PolyGeo

1
Đây có phải là danh sách tên cuối cùng hoặc hai người, một người tên Bennett McCarl và một Arnette Bennett khác? Dường như một người có tên của Bennett và một người khác có họ của Bennett?
Aaron

1
Để làm điều này tôi nghĩ bạn cần đếm các từ duy nhất trong chuỗi của bạn và nếu nó ít hơn số lượng từ trong chuỗi của bạn thì có ít nhất một từ được nhân đôi. Phân biệt các từ đang hoặc có thể là họ với các từ khác sẽ là một bài tập riêng. Tôi nghĩ bạn nên chỉnh sửa câu hỏi của mình ở đây để làm cho các yêu cầu chính xác của bạn rõ ràng hơn và kết hợp câu hỏi đó với nghiên cứu Python tại Stack Overflow .
PolyGeo

1
Tôi đã sửa đổi câu hỏi của bạn tại stackoverflow.com/questions353165648/ vì nó được đặt theo cụm từ "ArcGIS-speak" thay vì "Python-speak". Hy vọng, nó sẽ không nhận được quá nhiều lượt tải trong khi chờ chỉnh sửa của tôi được chấp thuận.
PolyGeo

Câu trả lời:


2

Biểu thức tính toán trường dựa trên câu trả lời này

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

Nó sẽ trả về số lượng tối đa của các từ tương tự trong chuỗi


8

Bạn có thể sử dụng mô-đun bộ sưu tập Python và Cập nhật con trỏ để thực hiện việc này. Phương pháp này thêm một trường mới và điền vào đó 1nếu có bất kỳ trùng lặp nào, 0nếu không thì không có trùng lặp.

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)

nhập mô tả hình ảnh ở đây


1
Sử dụng tốt mô-đun bộ sưu tập này, không bao giờ biết nó tồn tại. Tôi đã suy nghĩ trên cùng một dòng nhưng sử dụng các biểu thức thông thường để trích xuất các từ lặp lại để tạo ra một trường cờ. Tôi nghĩ rằng cách tiếp cận của bạn bằng cách sử dụng chức năng truy cập là dễ hiểu hơn nhiều. Tôi sẽ kiểm tra mô-đun đó sau!
Hornbydd 3/2/2016

6

Điều gì về việc sử dụng resetthiết lập một cờ (ở đây 0 và 1) trong python- resẽ trích xuất tất cả các tên (cuối cùng và đầu tiên) BENNETT MCCARL & ARNETTE BENNETTmà không có &. Đối với kết hợp mẫu relà ưu tiên cao nhất - bạn có thể sử dụng recách bạn muốn.

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

Và gọi sorter( !N! )


bản giới thiệu


** Xem cách regexlấy từ tạiLIVE DEMO

Lưu ý rằng tất cả các câu trả lời này đều giải quyết vấn đề giả sử rằng dữ liệu của bạn được vệ sinh tức là có khoảng cách thích hợp giữa các từ nhưng nếu dữ liệu của bạn giống như thế BENNETTMCCARL&ARNETTEBENNETTthì tất cả những điều này sẽ thất bại. Trong trường hợp đó, bạn có thể cần phải sử dụng thuật toán Suffix Tree và may mắn là python có một số thư viện như ở đây .


regex để giải cứu, tốt đẹp!
Hornbydd

2

Giả sử dữ liệu nguồn của bạn là FeatureClass / Table trong Tệp GeoDatabase thì truy vấn sau đây sẽ chọn các hàng bạn yêu cầu:

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

namelà lĩnh vực, tôi chỉ tình cờ gọi nó name. Phần đầu tiên là kiểm tra phía bên trái, phần thứ hai đang kiểm tra bên phải. Truy vấn này rõ ràng là khó mã hóa để tìm kiếm BENNETT, nếu bạn cần chọn theo họ khác, hy vọng bạn có thể tìm ra những gì cần thay đổi?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.