PyQGIS – Getting Unique Values from Multiple Fields

fields-attributespyqgisunique value

There are "Code" and "Color" fields in my layer like this: (Sample 6 rows)

Code Color
A Red
B Blue
A Red
A Red
B Blue
C Green

All As are Red, all Bs are Blue and so on.

I can get the unique values for each field:

layer = iface.activeLayer()

code_index = layer.fields().indexFromName("Code")
code_unique = layer.uniqueValues(code_index)

color_index = layer.fields().indexFromName("Color")
color_unique = layer.uniqueValues(color_index)

print(code_unique)
print(color_unique)

# OUTPUT
# {'A', 'C', 'B'}
# {'Blue', 'Red', 'Green'}

As you can see, the order of two outputs doesn't match. (When you try, you might get an ordered result, but it depends and is not reliable)

How can I get unique value pairs like [('A', 'Red'), ('B', 'Blue'), ('C', 'Green')] using PyQGIS?

I couldn't find groupby-like method. It can be done by means of groupby(["Code", "Color"]).first() in GeoPandas.

Best Answer

You can use set() which is a Python built-in function.

layer = iface.activeLayer()    

pairs = list(set([(f["Code"], f["Color"]) for f in layer.getFeatures()]))

print(pairs) # [('A', 'Red'), ('C', 'Green'), ('B', 'Blue')]

A set() is an unordered data structure, so it does not preserve the insertion order. You will probably get an unordered but a matched list (('A', 'Red') ('C', 'Green'), ...).

Related Question