আমার কাছে এর মতো নালাগুলির একটি তালিকা রয়েছে:
[{'value': 'apple', 'blah': 2},
{'value': 'banana', 'blah': 3} ,
{'value': 'cars', 'blah': 4}]
আমি চাই ['apple', 'banana', 'cars']
এটি করার সর্বোত্তম উপায় কী?
আমার কাছে এর মতো নালাগুলির একটি তালিকা রয়েছে:
[{'value': 'apple', 'blah': 2},
{'value': 'banana', 'blah': 3} ,
{'value': 'cars', 'blah': 4}]
আমি চাই ['apple', 'banana', 'cars']
এটি করার সর্বোত্তম উপায় কী?
উত্তর:
প্রতিটি ডিকের একটি value
কী আছে ধরে ধরে আপনি লিখতে পারেন (আপনার তালিকার নামটি ধরে রেখেছেন l
)
[d['value'] for d in l]
যদি value
অনুপস্থিত থাকতে পারে, আপনি ব্যবহার করতে পারেন
[d['value'] for d in l if 'value' in d]
মানচিত্র () এবং ল্যাম্বদা ফাংশন ব্যবহার করে এটি করার আরও একটি উপায় এখানে রয়েছে:
>>> map(lambda d: d['value'], l)
যেখানে আমি তালিকা। আমি এইভাবে "সেক্সিয়েস্ট" দেখছি, তবে আমি তালিকা বোধগম্যতা ব্যবহার করে এটি করব would
আপডেট: যদি সেই 'মান' মূল ব্যবহার হিসাবে নিখোঁজ থাকে:
>>> map(lambda d: d.get('value', 'default value'), l)
আপডেট: আমি ল্যাম্বডাসের খুব বড় অনুরাগী নই, আমি জিনিসগুলির নামকরণ করতে পছন্দ করি ... এই বিষয়টি আমি মনে রেখে এইভাবে করব:
>>> import operator
>>> map(operator.itemgetter('value'), l)
আমি আরও এগিয়ে গিয়ে একটি একক ফাংশন তৈরি করব যা স্পষ্টভাবে বলতে চাই যে আমি কী অর্জন করতে চাই:
>>> import operator, functools
>>> get_values = functools.partial(map, operator.itemgetter('value'))
>>> get_values(l)
... [<list of values>]
পাইথন 3, যেহেতু map
আয় কোনো ইটারেটরে, ব্যবহার list
একটি তালিকা ফিরতে যেমন list(map(operator.itemgetter('value'), l))
।
map
, ব্যবহার operator.itemgetter('value')
, না একটি lambda
।
[x['value'] for x in list_of_dicts]
getkey
.. আপনার মানে d.get('value')
? এটি মিছাল নয়, @ ইসদাবির দ্বিতীয় তালিকা অনুধাবনের সমান হবে।
এর মতো খুব সাধারণ মামলার জন্য, বোধগম্যতা যেমন, ইসমাইল বাদামীর উত্তর অবশ্যই যাওয়ার উপায়।
তবে যখন জিনিসগুলি আরও জটিল হয়ে ওঠে এবং আপনার মধ্যে জটিল অভিব্যক্তিগুলির সাথে মাল্টি-ক্লজ বা নেস্টেড বোধগম্যগুলি লেখা শুরু করা দরকার তখন এটি অন্যান্য বিকল্পগুলির দিকে তাকাতে মূল্যবান। নেস্টেড ডিক-অ্যান্ড-লিস্ট স্ট্রাকচার, যেমন জেএসওনপথ, ডিপ্যাথ এবং কেভিসিতে এক্সপথ-স্টাইল অনুসন্ধানগুলি নির্দিষ্ট করার জন্য কয়েকটি পৃথক (কোয়াসি) মানক উপায় রয়েছে। এবং তাদের জন্য পিপিআইতে দুর্দান্ত লাইব্রেরি রয়েছে।
নামকৃত লাইব্রেরিটির সাথে এখানে উদাহরণ রয়েছে যা dpath
দেখায় এটি কীভাবে কিছুটা জটিল জটিল কিছু সহজ করতে পারে:
>>> dd = {
... 'fruits': [{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3}],
... 'vehicles': [{'value': 'cars', 'blah':4}]}
>>> {key: [{'value': d['value']} for d in value] for key, value in dd.items()}
{'fruits': [{'value': 'apple'}, {'value': 'banana'}],
'vehicles': [{'value': 'cars'}]}
>>> dpath.util.search(dd, '*/*/value')
{'fruits': [{'value': 'apple'}, {'value': 'banana'}],
'vehicles': [{'value': 'cars'}]}
বা, ব্যবহার করে jsonpath-ng
:
>>> [d['value'] for key, value in dd.items() for d in value]
['apple', 'banana', 'cars']
>>> [m.value for m in jsonpath_ng.parse('*.[*].value').find(dd)]
['apple', 'banana', 'cars']
এটি প্রথম নজরে একেবারে সহজ দেখায় না, কারণ find
প্রত্যাবর্তনকারী অবজেক্টগুলিতে, যা কেবলমাত্র ম্যাচ করা মান ছাড়াও সমস্ত ধরণের জিনিস অন্তর্ভুক্ত করে, যেমন প্রতিটি আইটেমের সরাসরি পথ। তবে আরও জটিল '*.[*].value'
ভাবের জন্য, প্রত্যেকের জন্য বোঝার ধারাটির পরিবর্তে একটি পথ নির্দিষ্ট করতে সক্ষম হওয়া *
একটি বড় পার্থক্য করতে পারে। প্লাস, জেএসওনপথ একটি ভাষা-অজ্ঞাত সম্পর্কিত স্পেসিফিকেশন এবং এমন কোনও অনলাইন পরীক্ষকও রয়েছে যা ডিবাগিংয়ের জন্য খুব কার্যকর হতে পারে।
আমি মনে করি নীচের মতো সহজ আপনি আপনাকে যা খুঁজছেন তা দেবে।
In[5]: ll = [{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3} , {'value': 'cars', 'blah':4}]
In[6]: ld = [d.get('value', None) for d in ll]
In[7]: ld
Out[7]: ['apple', 'banana', 'cars']
আপনি এটির পাশাপাশি map
এবং এর সাথে সংমিশ্রণে এটি করতে পারেন lambda
তবে তালিকা বোধগম্যতা আরও মার্জিত এবং পাইথোনিক দেখায়।
একটি ছোট ইনপুট তালিকা বোধগম্যতা জন্য উপায় হয় তবে যদি ইনপুটটি সত্যিই বড় হয় তবে আমার ধারণা জেনারেটরগুলি আদর্শ উপায়।
In[11]: gd = (d.get('value', None) for d in ll)
In[12]: gd
Out[12]: <generator object <genexpr> at 0x7f5774568b10>
In[13]: '-'.join(gd)
Out[13]: 'apple-banana-cars'
বড় ইনপুটটির জন্য সমস্ত সম্ভাব্য সমাধানের তুলনা এখানে দেওয়া হল
In[2]: l = [{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3} , {'value': 'cars', 'blah':4}] * 9000000
In[3]: def gen_version():
...: for i in l:
...: yield i.get('value', None)
...:
In[4]: def list_comp_verison():
...: return [i.get('value', None) for i in l]
...:
In[5]: def list_verison():
...: ll = []
...: for i in l:
...: ll.append(i.get('value', None))
...: return ll
In[10]: def map_lambda_version():
...: m = map(lambda i:i.get('value', None), l)
...: return m
...:
In[11]: %timeit gen_version()
172 ns ± 0.393 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In[12]: %timeit map_lambda_version()
203 ns ± 2.31 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In[13]: %timeit list_comp_verison()
1.61 s ± 20.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In[14]: %timeit list_verison()
2.29 s ± 4.58 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
যেমন আপনি দেখতে পাচ্ছেন, জেনারেটরগুলি অন্যের তুলনায় আরও ভাল সমাধান, জেনারেটরের তুলনায় মানচিত্রটিও ধীরতর কারণ কারণ হিসাবে আমি খুঁজে বের করতে ওপিতে ছেড়ে যাব।
উদাহরন্টি অনুসরন কর --
songs = [
{"title": "happy birthday", "playcount": 4},
{"title": "AC/DC", "playcount": 2},
{"title": "Billie Jean", "playcount": 6},
{"title": "Human Touch", "playcount": 3}
]
print("===========================")
print(f'Songs --> {songs} \n')
title = list(map(lambda x : x['title'], songs))
print(f'Print Title --> {title}')
playcount = list(map(lambda x : x['playcount'], songs))
print(f'Print Playcount --> {playcount}')
print (f'Print Sorted playcount --> {sorted(playcount)}')
# Aliter -
print(sorted(list(map(lambda x: x['playcount'],songs))))
অজগর অভিধানের তালিকা থেকে মূল মান পান?
উদা:
data =
[{'obj1':[{'cpu_percentage':'15%','ram':3,'memory_percentage':'66%'}]},
{'obj2': [{'cpu_percentage':'0','ram':4,'memory_percentage':'35%'}]}]
ডেটা জন্য ডি:
for key,value in d.items():
z ={key: {'cpu_percentage': d['cpu_percentage'],'memory_percentage': d['memory_percentage']} for d in value}
print(z)
আউটপুট:
{'obj1': {'cpu_percentage': '15%', 'memory_percentage': '66%'}}
{'obj2': {'cpu_percentage': '0', 'memory_percentage': '35%'}}