Đang cố gắng trích xuất danh sách các Giá trị duy nhất từ ​​một trường bằng python


11

Tôi có một số cột trong một số bảng với một FGDB nơi tôi cần trích xuất các giá trị duy nhất cho mỗi cột.

Ví dụ: các giá trị có thể là [1,2,2,2,3,4] và tôi đang cố gắng trả về [1,2,3,4]

Tôi có thể thực hiện công việc này một số cách khác trong ARCGIS nhưng tôi đang cố gắng mở rộng bản thân.

Tôi đã tìm thấy một đoạn python trên web mà tôi nghĩ sẽ thực hiện công việc nhưng tôi đang vật lộn để chạy nó (tôi cứ bị lỗi cú pháp không hợp lệ vì tôi cứ bị lỗi cú pháp ở dòng 3) điều này sẽ không còn nghi ngờ gì nữa một lỗi người dùng thực sự đơn giản.

Đoạn mã dưới đây

import arcpy

def unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj'):
with arcpy.da.SearchCursor(table, [field]) as cursor:
    return sorted({row[0] for row in cursor})

Đây là Thông báo Lỗi tôi nhận được từ văn bản cao siêu:

 File "C:\Users\hawkinle\Desktop\STDTAS\Unique_Data.py", line 3
def unique_values(r'N:\GISProjects\Steve_Eastwood_Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj'):
                                                                                                                             ^
SyntaxError: invalid syntax
[Finished in 0.1s with exit code 1]

Cập nhật từ câu hỏi gốc

Bây giờ tôi đã cập nhật mã của mình với câu trả lời được cung cấp bên dưới nhưng đang nhận được một lỗi thứ cấp.

Đoạn mã mới:

import arcpy

def unique_values(table , field):
    with arcpy.da.SearchCursor(table, [field]) as cursor:
        return sorted({row[0] for row in cursor})

myValues = unique_values(r'N:\\GISProjects\\Landuse\\Plant_Biosecurity_Project\\ArcGIS_Online.gdb\\Holdings_Property_Merge' , 'LU_ALUMMaj')

print (myValues)

Tôi nhận được một thông báo lỗi mới liên quan đến lỗi thời gian chạy

Traceback (most recent call last):
File "C:\Users\hawkinle\Desktop\STDTAS\Unique_Data.py", line 7, in <module>
myValues = unique_values(r'N:\\GISProjects\\Steve_Eastwood_Landuse \Plant_Biosecurity_Project\\ArcGIS_Online.gdb\\Holdings_Property_Merge' , 'LU_ALUMMaj')
 File "C:\Users\hawkinle\Desktop\STDTAS\Unique_Data.py", line 4, in unique_values
with arcpy.da.SearchCursor(table, [field]) as cursor:
RuntimeError: cannot open 'N:\\GISProjects\\Steve_Eastwood_Landuse\\Plant_Biosecurity_Project\\ArcGIS_Online.gdb\\Holdings_Property_Merge'

[Hoàn thành sau 8.0 giây với mã thoát 1]

Tôi giả sử từ việc đọc tôi đã làm rằng điều này liên quan đến việc thiết lập env.workspace?

Chỉ cần chứng minh rằng nó tồn tại


1
vui lòng chỉnh sửa câu hỏi của bạn để bao gồm toàn bộ thông báo lỗi của bạn (dưới dạng văn bản)
Midavalo

Lỗi mới của bạn không nên có bất cứ điều gì liên quan đến env.workspacetôi không nghĩ. Hãy thử cất cánh rtrước đường dẫn hoặc thay đổi \` to `trong đường dẫn (và rời khỏi rđó). Cơ sở dữ liệu địa lý đó có tồn tại không?
Midavalo

Bạn đang cố gắng cô lập tất cả các giá trị duy nhất trong một trường? Ví dụ: giả sử bạn có các giá trị sau [1,2,2,2,3,4], bạn đang cố gắng trả lại [1,2,3,4]. Vui lòng cập nhật bài viết để bao gồm thông tin này.
Aaron

@Midavalo bạn đã có nghĩa là thay đổi tolook con đường như thế này r'N: GISProjects _Landuse Plant_Biosecurity_Project ArcGIS_Online.gdb Holdings_Property_Merge', 'LU_ALUMMaj'
Leith Hawkins

1
Cảm ơn - bằng chứng rõ ràng hơn rằng tôi không thông minh lắm nhưng tôi có thể nâng những vật nặng. Tôi nợ bạn một speights !!
Leith Hawkins

Câu trả lời:


14

Bạn đã có khá nhiều, bạn chỉ cần xác định tên của các tham số tablefieldtrong định nghĩa hàm của bạn, sau đó chuyển các giá trị đó khi bạn gọi hàm. Đồng thời xem vết lõm của bạn, vì nó rất quan trọng đối với Python.

def unique_values(table , field):
    with arcpy.da.SearchCursor(table, [field]) as cursor:
        return sorted({row[0] for row in cursor})

myValues = unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj')

print (myValues)

Về cơ bản, điều này nói rằng khi bạn gọi hàm, unique_values()bạn sẽ chuyển các giá trị cho hai tham số, một tham số được gọi table, tham số khác được gọi field. Chúng sau đó được sử dụng trong chức năng của bạn. Khi bạn gọi hàm, trong dòng

myValues = unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj')  

bạn đang truyền các giá trị cho các tham số này.

Điều này giống như khai báo các tham số của bạn một cách riêng biệt và chuyển chúng trực tiếp đến con trỏ:

table = r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge'
field = 'LU_ALUMMaj'

with arcpy.da.SearchCursor(table, [field]) as cursor:
    myValues = sorted({row[0] for row in cursor})

print myValues

Điều đó có ý nghĩa, khi bạn bao gồm các thông số cá nhân bên dưới tôi sẽ hiểu những gì bạn đang nói thankyou! . Tôi biết di chuyển lên chuỗi lỗi vì tôi đang gặp lỗi thời gian chạy không cho phép tôi mở cơ sở dữ liệu hiện có. Ill cập nhật câu hỏi của tôi.
Leith Hawkins

Tại sao dòng được sắp xếp () chỉ trả về một thể hiện duy nhất của mỗi giá trị khi hàm được sắp xếp () trả về các bản sao nếu bạn chạy nó trong một danh sách đơn giản như ['a', 'b', 'a', 'b']? Tôi đã sử dụng trả lời này một thời gian và nhận ra tôi không hiểu tại sao nó hoạt động.
Dylan Warburg

2
@DylanWarburg Vì bạn không chuyển danh sách giá trị, bạn sẽ chuyển một bộ . Nếu bạn thêm các mục danh sách của bạn ở trên vào một tập hợp, ví dụ: set(['a', 'b', 'a', 'b'])nó sẽ trả về các giá trị duy nhất {'a', 'b'}. Sử dụng sorted()chỉ trả về chúng theo thứ tự được sắp xếp như một bộ đơn giản là không được sắp xếp.
Midavalo

Nếu trường bạn đang tìm kiếm các giá trị duy nhất từ ​​không phải là một chuỗi, bạn nên thêm: return
sort

8

Tôi sẽ tư vấn cho sử dụng Python tích hợp trong set()chức năng cùng với một SearchCursornhư một biểu hiện phát để tìm ra giá trị duy nhất. Bạn sẽ thấy phương pháp này cực kỳ hiệu quả với các bộ dữ liệu lớn hay nhỏ:

import arcpy

fc = r'C:\path\to\your.gdb\featureclass'

unique_values = set(row[0] for row in arcpy.da.SearchCursor(fc, "some_field"))

1
Đây thực chất là những gì câu trả lời của @ Midavalo đang làm cũng như các dấu ngoặc {} đang được sử dụng để xác định một đối tượng đã đặt .
dùng2856

1
Tôi xem xét đề xuất chính xác điều tương tự. Nếu những gì bạn muốn là một danh sách, bạn luôn có thể biến tập hợp trở lại thành một danh sách với danh sách python gốc () fx.
jbeclill

3

Cách tiếp cận sau đây đã được xuất bản trên https://arcpy.wordpress.com/2012/02/01/create-a-list-of-unique-field-values/ Nó đang sử dụng arcpy và numpy và có dung lượng bộ nhớ nhỏ hơn so với Phương pháp tìm kiếm.

import arcpy
import numpy

def unique_values(table , field):
    data = arcpy.da.TableToNumPyArray(table, [field])
    return numpy.unique(data[field]).tolist()

myValues = unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj')

print (myValues)

0

Tôi biết đó là một câu hỏi cũ, nhưng tôi sẽ để nó ở đây cho bất cứ ai tình cờ tìm kiếm sự giúp đỡ này. Việc sử dụng arcpy.Frequency_analysis()nhanh chóng đặt tất cả các giá trị duy nhất từ ​​một trường vào một bảng mới, sau đó bạn có thể sử dụng cho các hoạt động con trỏ. Một lệnh duy nhất để làm những gì tất cả các giải pháp khác làm và nhanh hơn và dễ dàng hơn. Là một phần thưởng, bạn cũng nhận được số lần mỗi giá trị xuất hiện.

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.