कुंजी के द्वारा dict की एक सूची क्रमबद्ध करें। कुंजी याद आ रही है, तो एक लगातार नंबर मान

वोट
0

मैं तो कुंजी स्थिति द्वारा शब्दकोशों की एक सूची को सॉर्ट करना चाहते हैं। हालांकि, अगर स्थिति शब्दकोष में याद आ रही है, मैं आइटम (रों) के आदेश रखने के लिए और लगता है कि स्थिति सूची में आइटम के 1 आधारित सूचकांक है करना चाहते हैं।

यह ठीक काम कर रहा है, जब तक कि सभी सूची आइटम अलग हैं:

L = [
    {   id: 1 }, # assume pos: 1
    {   id: 2 }, # assume pos: 2
    {   id: 3 }, # assume pos: 3
    {   id: 4 }, # assume pos: 4
    {   id: ZZZ }, # assume pos: 5
    {   id: AAA }, # assume pos: 6
    {   id: ABC, pos: 3.2 },
    {   id: XYZ, pos: 3.1 },
]

s = sorted(L,key=lambda i:i.get(pos,L.index(i)+1))
print(s)

आउटपुट:

[{'id': '1'}, {'id': '2'}, {'id': '3'}, {'id': 'XYZ', 'pos': 3.1}, {'id': 'ABC', 'pos': 3.2}, {'id': '4'}, {'id': 'ZZZ'}, {'id': 'AAA'}]

लेकिन यह विफल रहता है अगर मैं एक ही आइटम के कई है, क्योंकि तब list.indexपहला मामला वापस आ जाएगी, बल्कि ग्रहण की स्थिति 'से।

L = [
    {   id: 1 }, # assume pos: 1
    {   id: 1 }, # assume pos: 2
    {   id: 1 }, # assume pos: 3
    {   id: 1 }, # assume pos: 4
    {   id: 1 }, # assume pos: 5
    {   id: AAA }, # assume pos: 6
    {   id: ABC, pos: 3.2 },
    {   id: XYZ, pos: 3.1 },
]

s = sorted(L,key=lambda i:i.get(pos,L.index(i)+1))
print(s)

वास्तविक उत्पादन:

[{'id': '1'}, {'id': '1'}, {'id': '1'}, {'id': '1'}, {'id': '1'}, {'id': 'XYZ', 'pos': 3.1}, {'id': 'ABC', 'pos': 3.2}, {'id': 'AAA'}]

अपेक्षित उत्पादन:

[{'id': '1'}, {'id': '1'}, {'id': '1'}, {'id': 'XYZ', 'pos': 3.1}, {'id': 'ABC', 'pos': 3.2}, {'id': '1'}, {'id': '1'}, {'id': 'AAA'}]

कैसे छंटाई की उम्मीद उत्पादन वापस जाने के लिए बदला जा सकता है?

नोट: आइटम आईडी किसी भी क्रम में होने की गारंटी नहीं कर रहे हैं, कि साधन 1,2,3,4,AAA,ABC,XYZमनमाने ढंग से चुना गया है।

09/10/2019 को 13:00
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
6

का प्रयोग करें की गणना :

L = [
    {"id": "1"},  # assume pos: 1
    {"id": "2"},  # assume pos: 2
    {"id": "3"},  # assume pos: 3
    {"id": "4"},  # assume pos: 4
    {"id": "ZZZ"},  # assume pos: 5
    {"id": "AAA"},  # assume pos: 6
    {"id": "ABC", "pos": 3.2},
    {"id": "XYZ", "pos": 3.1},
]

result = [e for _, e in sorted(enumerate(L, 1), key=lambda x: x[1].get("pos", x[0]))]

print(result)

उत्पादन

[{'id': '1'}, {'id': '2'}, {'id': '3'}, {'id': 'XYZ', 'pos': 3.1}, {'id': 'ABC', 'pos': 3.2}, {'id': '4'}, {'id': 'ZZZ'}, {'id': 'AAA'}]

डुप्लिकेट उदाहरण के लिए:

L = [
    {"id": "1"},  # assume pos: 1
    {"id": "1"},  # assume pos: 2
    {"id": "1"},  # assume pos: 3
    {"id": "1"},  # assume pos: 4
    {"id": "1"},  # assume pos: 5
    {"id": "AAA"},  # assume pos: 6
    {"id": "ABC", "pos": 3.2},
    {"id": "XYZ", "pos": 3.1},
]

result = [e for _, e in sorted(enumerate(L, 1), key=lambda x: x[1].get("pos", x[0]))]

print(result)

उत्पादन

[{'id': '1'}, {'id': '1'}, {'id': '1'}, {'id': 'XYZ', 'pos': 3.1}, {'id': 'ABC', 'pos': 3.2}, {'id': '1'}, {'id': '1'}, {'id': 'AAA'}]

एक शायद क्लीनर विकल्प का उपयोग करने के लिए है itertools.count :

from itertools import count

counter = count(1)

result = sorted(L, key=lambda x: x.get("pos", next(counter)))
print(result)
09/10/2019 को 13:08
का स्रोत उपयोगकर्ता

वोट
0

हम कुछ इस तरह कर सकते हैं:

d = [
    {"id": "1"}, # assume pos: 1
    {"id": "1"}, # assume pos: 2
    {"id": "1"}, # assume pos: 3
    {"id": "1"}, # assume pos: 4
    {"id": "1"}, # assume pos: 5
    {"id": "AAA"}, # assume pos: 6
    {"id": "ABC", "pos": 3.2},
    {"id": "XYZ", "pos": 3.1},
]


def my_compare(x):
    if 'pos' in x[1]:
        return x[1]['pos']
    return x[0] + 1

sorted_d = [x[1] for x in sorted(enumerate(d), key=my_compare)]

expected_output = [
    {'id': '1'}, 
    {'id': '1'}, 
    {'id': '1'}, 
    {'id': 'XYZ','pos': 3.1}, 
    {'id': 'ABC','pos': 3.2}, 
    {'id': '1'}, 
    {'id': '1'}, 
    {'id': 'AAA'},
]
assert sorted_d == expected_output

09/10/2019 को 13:26
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more