निम्नलिखित कोड पर विचार करें:

some_list = [
    {'id' : '3459', 'name' : 'Alice'},
    {'id' : '1112', 'name': 'Bob'}
]
person_id = '3459'
# Search person id in list of dictionaries and return {'id' : '3459', 'name' : 'Alice'}

person_id को जानने के बाद, क्या इस some_list को 'id' से खोजना संभव है, ताकि पूरे शब्दकोश को हथिया लिया जा सके? वर्तमान में मैं इसे लूप के साथ कर रहा हूं, लेकिन अगर कोई अन्य कार्यान्वयन होता तो मैं उत्सुक था। उत्तर देने वालों के लिए धन्यवाद।

2
Kyle DeGennaro 26 जुलाई 2019, 15:26

4 जवाब

सबसे बढ़िया उत्तर

आप संरचना को एक नेस्टेड शब्दकोश में बदल सकते हैं, जहां कुंजी id है। फिर आप सूची को रैखिक O(N) समय में स्कैन करने के बजाय निरंतर O(1) लुकअप बनाए रखते हैं।

उदाहरण:

data = {
    '3459': {
        'name' : 'Alice'
    },
    '1112': {
        'name': 'Bob'
    }
}

person_id = '3459'

print(data[person_id])
# {'name': 'Alice'}

आपके पास एक शब्दकोश के बजाय केवल name मान के रूप में हो सकता है:

data = {
    '3459': 'Alice',
    '1112': 'Bob'
}

person_id = '3459'

print(data[person_id])
# Alice

नोट: यह कोई डुप्लीकेट आईडी नहीं मानता है, जैसा कि @Chris_Rands का कमेंट में उल्लेख किया गया है

5
RoadRunner 26 जुलाई 2019, 15:45

आप निम्न कोशिश कर सकते हैं:

[entry for entry in some_list if person_id in entry['id']]

यदि आप चाहते हैं कि परिणाम एक सूची न हो, तो इसे आजमाएं:

[entry for entry in some_list if person_id in entry['id']][0]
1
Carsten 26 जुलाई 2019, 15:28
import pandas as pd
import time
start = time.time() 

person_id = '3459'
some_list = [
    {'id' : '3459', 'name' : 'Alice'},
    {'id' : '1112', 'name': 'Bob'}
]

a = pd.DataFrame(some_list) 
a.drop(a.loc[a['id']==person_id].index, inplace=True)
end = time.time()
print(a)
print(end - start)    

उत्पादन

     id name
1  1112  Bob
0.0030059814453125
0
frankegoesdown 26 जुलाई 2019, 15:42

यह ठीक काम करता है:

some_list = [
{'id' : '3459', 'name' : 'Alice'},
{'id' : '1112', 'name': 'Bob'}
]

person_id = '3459'

result = list(filter(lambda x : x['id'] == person_id, 
some_list))

print(result)
0
Stian Diehard 26 जुलाई 2019, 20:28