Permalänk
Medlem

Sortera dict med värde i python

Hej,

Jag skulle vilja veta hur man sorterar en dict med olika kategori värde för att få det i ordningen "Values" nedan? Det ska sorteras enligt ordningen i "Categories".

Categories: {'Group 1', 'Cars', 'Models'} Values: {'Test 1': 'Group 1', 'Test 2': 'Group 1', 'Bmw': 'Cars', 'Mercedes': 'Cars', '330D': 'Models', 'C3': 'Models'}

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Medlem
Skrivet av M89:

Hej,

Jag skulle vilja veta hur man sorterar en dict med olika kategori värde för att få det i ordningen "Values" nedan? Det ska sorteras enligt ordningen i "Categories".

Categories: {'Group 1', 'Cars', 'Models'} Values: {'Test 1': 'Group 1', 'Test 2': 'Group 1', 'Bmw': 'Cars', 'Mercedes': 'Cars', '330D': 'Models', 'C3': 'Models'}

Något i stil med detta borde fungera:

values = {'Test 1': 'Group 1', 'Test 2': 'Group 1', 'Bmw': 'Cars', 'Mercedes': 'Cars', '330D': 'Models', 'C3': 'Models'} categories = ['Group 1', 'Cars', 'Models'] sortedvalues = dict(sorted(values.items(), key=lambda x: categories.index(x[1])))

just key-argumentet till sorted är väl själva grejen att fokusera på, det definierar vad det är som elementen ska sorteras på

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av evil penguin:

Något i stil med detta borde fungera:

values = {'Test 1': 'Group 1', 'Test 2': 'Group 1', 'Bmw': 'Cars', 'Mercedes': 'Cars', '330D': 'Models', 'C3': 'Models'} categories = ['Group 1', 'Cars', 'Models'] sortedvalues = dict(sorted(values.items(), key=lambda x: categories.index(x[1])))

just key-argumentet till sorted är väl själva grejen att fokusera på, det definierar vad det är som elementen ska sorteras på

Jag missade skriva att categories är ett set().

Error Contents: 'set' object has no attribute 'index'

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Medlem
Skrivet av M89:

Jag missade skriva att categories är ett set().

Error Contents: 'set' object has no attribute 'index'

Det är dock en synnerligen olämplig datatyp om categories ska representera ordningen du vill ha?
(En mängd (set på engelska) har ingen definierad ordning, det säger bara vilka element som finns)

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av evil penguin:

Det är dock en synnerligen olämplig datatyp om categories ska representera ordningen du vill ha?
(En mängd (set på engelska) har ingen definierad ordning, det säger bara vilka element som finns)

Jag misstänkte det så jag gjorde om det till en lista, men den sorterar inte i ordningen man väljer. :/

Edit:

Jag har nog hittat orsaken, återkommer.

Edit2:

Allt fungerar tack!

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Medlem

För de som undrar så ser den slutgiltiga koden ut så här:

categories = list() values = dict(self.database.getCategoryMap()) current_categories = list(self.database.getAllCategories()) for category in range(len(current_categories)): res = xbmcgui.Dialog().select('Categories', current_categories) if res > -1: cat = current_categories[res] categories.append(cat) current_categories.pop(res) sortedvalues = dict(sorted(values.items(), key=lambda x: categories.index(x[1])))

Stort tack @evil penguin!

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk

Hur ofta kommer man linjärsöka sig igenom categories? Kan du göra sorteringen effektivare?

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Hur ofta kommer man linjärsöka sig igenom categories? Kan du göra sorteringen effektivare?

Tja, bra fråga dock fungerar det för ändamålet då det inte rör sig om några stora mängder data för just det jag ska använda det till.

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Hur ofta kommer man linjärsöka sig igenom categories? Kan du göra sorteringen effektivare?

Exempel inom spoilers?

Visa signatur

"Nobody smart would play fair"

Permalänk
Skrivet av MeSaber:

Exempel inom spoilers?

Det är ett halvår sedan jag skrev det där. Kommer inte ihåg någonting...

Skulle tro att det var categories.index()-anropet i lambda som jag reagerade på. Det kommer sannolikt anropas ganska ofta och om man har många kategorier skulle det kunna vara effektivare om man bytte listan mot ett dictionary med ordningsnummer. Då kommer den operationen gå i konstant tid istället för linjärt i antalet kategorier. Men det beror som sagt på ens data. Om man oftast träffar oftast tidigt i listan är det tveksamt om man tjänar på att byta till ett dict.