|
skapi85
Anmeldungsdatum: 19. August 2017
Beiträge: 48
|
Hallo, ich habe hier eine Zeile die z.B. so aussieht
| sort_weight={'alpha': {'sort': 10}, 'beta': {'sort': 20}, 'gamma': {'sort': 30}, 'delta': {'sort': 40},'epsilon': {'sort': 50}, 'zeta': {'sort': 60}}
|
Es gibt nun zwei Szenarien die Eintreten können (testA & testB sollen immer folgende Werte bekommen: 'testA': {'sort': 10}, 'testB': {'sort': 20}) : A) testA & testB ist im String angeführt z.B. so
| sort_weight={'alpha': {'sort': 10}, 'beta': {'sort': 20}, 'gamma': {'sort': 30}, 'delta': {'sort': 40},'epsilon': {'sort': 50},'testB': {'sort': 60}, 'zeta': {'sort': 70},'testA': {'sort': 80}}
|
B) testA & testB ist nicht im String enthalten Das Problem ist nun dass das Ergebnis so aussehen soll
| sort_weight={'testA': {'sort': 10}, 'testB': {'sort': 20}, 'alpha': {'sort': 30}, 'beta': {'sort': 40}, 'gamma': {'sort': 50}, 'delta': {'sort': 60},'epsilon': {'sort': 70}, 'zeta': {'sort': 80}}
|
Hat jemand einen Tipp wie ich am besten zu dem o.a. Ergebnis komme?
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
Mir ist anhand der Beschreibung der Algorithmus noch nicht ganz klar - verstehe ich das richtig, dass die Werte bereits sortiert und die Werte für sort immer Vielfache von 10 sind und du dann testA und testB davor einordnen willst und für die gesamte Folge der Wert von sort bei 10 beginnend als Vielfache von 10 hochgezählt wird? Mit Python 3 sähe das z.B. so aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | #!/usr/bin/env python3
sort_weight={'alpha': {'sort': 10}, 'beta': {'sort': 20}, 'gamma': {'sort': 30}, 'delta': {'sort': 40},'epsilon': {'sort': 50}, 'zeta': {'sort': 60}}
for n, key in enumerate(('testA', 'testB')):
sort_weight[key] = {'sort': n}
result = {}
for n, item in enumerate(
sorted(sort_weight.items(),
key=lambda k_v: k_v[1]['sort']), start=1):
key, value = item
result[key] = {'sort': n * 10}
print(result)
|
|
|
skapi85
(Themenstarter)
Anmeldungsdatum: 19. August 2017
Beiträge: 48
|
@seahawk1986 Du hast absolut Recht! Der Sting ist vorsortiert.
Würde ich testA & testB einfach einfügen (wenn diese im String nicht vorhanden sind), würde es zum Konflikt kommen da jeweils "'sort': 10" & "'sort': 20" zweimal vorkommen würde bzw. wenn testA & testB im String schon vorhanden ist, müsste die Sortierung neu gemacht werden. Achja, ich würde das ganze gerne in BASH umsetzten.
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
In dem Fall könnte man das lösen, ohne die verhunzten JSON-Daten (die Strings haben Single- statt Double-Quotes) "ordentlich" zu parsen, wenn einen nur die Reihenfolge der Keys in der ersten Objektebene interessiert:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | #!/bin/bash
a="sort_weight={'alpha': {'sort': 10}, 'beta': {'sort': 20}, 'gamma': {'sort': 30}, 'delta': {'sort': 40},'epsilon': {'sort': 50}, 'zeta': {'sort': 60}}"
b="sort_weight={'alpha': {'sort': 10}, 'beta': {'sort': 20}, 'gamma': {'sort': 30}, 'delta': {'sort': 40},'epsilon': {'sort': 50},'testB': {'sort': 60}, 'zeta': {'sort': 70},'testA': {'sort': 80}}"
for data in "$a" "$b"; do
r=('testA' 'testB')
while read -r key; do
r+=("$key")
done < <(grep -Po "(?<=')(?!sort|testA|testB)\S*?(?=')" <<< "$data")
i=1
echo -n "${data%=*}="
for key in "${r[@]}"; do
printf "'%s': {'sort': %d}, " "$key" $(( i * 10 ))
(( i++ ))
done | sed 's/, $//'
echo "}"
done
|
Das liefert dann:
$ bash transform.sh
sort_weight={'testA': {'sort': 10}, 'testB': {'sort': 20}, 'alpha': {'sort': 30}, 'beta': {'sort': 40}, 'gamma': {'sort': 50}, 'delta': {'sort': 60}, 'epsilon': {'sort': 70}, 'zeta': {'sort': 80}}
sort_weight={'testA': {'sort': 10}, 'testB': {'sort': 20}, 'alpha': {'sort': 30}, 'beta': {'sort': 40}, 'gamma': {'sort': 50}, 'delta': {'sort': 60}, 'epsilon': {'sort': 70}, 'zeta': {'sort': 80}}
|
|
skapi85
(Themenstarter)
Anmeldungsdatum: 19. August 2017
Beiträge: 48
|
Wow!!
Genau so ist es Perfekt!!
Vielen Dank für deine Mühen!!
|