piton lug'at tushunchasini o'zgartiradi

Salom, men qarorni hal qilishga intilaman va muvaffaqiyatga asoslangan qiymatlarni chop qilaman agar "success" ning qiymati "0" dan farqli bo'lsa, "0" qiymati to'g'ri. ex uchun: lug'at

info = {'data': {'sample1': {'item': 'fruit1',
                             'id': 1,
                             'results': {'Apple': [{
                                 'start_ts': 1487579550,
                                 'success': True}],
                                 'Mango': [{
                                     'start_ts': 1487579550,
                                     'success': True}]
                             }
                             },
                 'sample2': {'item': 'fruit1',
                             'id': 2,
                             'results': {'Apple': [{
                                 'start_ts': 1487579550,
                                 'success': True}],
                                 'Mango': [{
                                     'start_ts': 1487579550,
                                     'success': False}]
                             }
                             },
                 'sample3': {'item': 'fruit2',
                             'id': 3,
                             'results': {'Apple': [{
                                 'start_ts': 1487579550,
                                 'success': True}],
                                 'Mango': [{
                                     'start_ts': 1487579550,
                                     'success': False}]
                             }
                             }
                 }}

chiqdi "fruit1" va fruit2 mahsulotlarining barcha elementlari uchun muvaffaqiyatga asoslangan bo'lishi va o'sish kerak.

chiqdi:

        Apple    Mango    
fruit1  2         1
fruit2  1         0

Bu murakkab lug'atni qayta ishlashning eng yaxshi yo'li nima? Ba'zi asosiy kodlarni sinab ko'rmoqdamiz:

for k, v in info.items():
    for i,sample in v.items():
      pprint.pprint(sample['results']) # Prints diction of Apples and Mango
1
Oddiy loops va count count yordamida oddiygina etarli bo'lishi kerak. Umid qilamanki, siz buni imkon qadar samarali qilishni o'rganishni xohlaysiz, shuning uchun avval so'rashga harakat qilayotganingizni ko'rsatishingiz kerak.
qo'shib qo'ydi muallif Juan Antonio, manba
Oddiy loops va count count yordamida oddiygina etarli bo'lishi kerak. Umid qilamanki, siz buni imkon qadar samarali qilishni o'rganishni xohlaysiz, shuning uchun avval so'rashga harakat qilayotganingizni ko'rsatishingiz kerak.
qo'shib qo'ydi muallif Juan Antonio, manba
Agar sizda data </​​code> deb nomlangan kalit mavjud bo'lsa va namunalar ro'yxati bo'lsa, siz namunalarni [] data </​​code> qiymatining qiymati kabi. Buni osonlashtirish uchun dictni ishlab chiqaradigan bo'lsangiz, namuna nomini (masalan, sample1 ) o'chirib tashlashingiz mumkin.
qo'shib qo'ydi muallif Juan Antonio, manba
Agar sizda data </​​code> deb nomlangan kalit mavjud bo'lsa va namunalar ro'yxati bo'lsa, siz namunalarni [] data </​​code> qiymatining qiymati kabi. Buni osonlashtirish uchun dictni ishlab chiqaradigan bo'lsangiz, namuna nomini (masalan, sample1 ) o'chirib tashlashingiz mumkin.
qo'shib qo'ydi muallif Juan Antonio, manba
O'zingiz ham o'zingizni qilishga harakat qildingizmi?
qo'shib qo'ydi muallif depperm, manba

6 javoblar

Xullas, oddiy oddiy yondashuv kabi, siz shunday bir narsa qilishingiz mumkin:

fruit1 = {'Apple': 0, 'Mango': 0}
fruit2 = {'Apple': 0, 'Mango': 0}

for k, v in info['data'].items():
    if v['item'] == 'fruit1':
        if v['results']['Apple'][0]['success']:
            fruit1['Apple'] += 1
        if v['results']['Mango'][0]['success']:
            fruit1['Mango'] += 1

    if v['item'] == 'fruit2':
        if v['results']['Apple'][0]['success']:
            fruit2['Apple'] += 1
        if v['results']['Mango'][0]['success']:
            fruit2['Mango'] += 1


print 'fruit1: {}'.format(fruit1)
print 'fruit2: {}'.format(fruit2)

Chiqish:

fruit1: {'Mango': 1, 'Apple': 2}
fruit2: {'Mango': 0, 'Apple': 1}

Faqat mevalarning nomi har doim bir xil bo'lsa (meva1 va 2) va bular doimo Apple va mango. Lekin eng yaxshi narsa bu muhim emas, sizning domeningizda maqsadga erishish uchun bu erdan ishlashingiz mumkin. Bu biroz iflos va, albatta, optimal emas.

0
qo'shib qo'ydi

Xullas, oddiy oddiy yondashuv kabi, siz shunday bir narsa qilishingiz mumkin:

fruit1 = {'Apple': 0, 'Mango': 0}
fruit2 = {'Apple': 0, 'Mango': 0}

for k, v in info['data'].items():
    if v['item'] == 'fruit1':
        if v['results']['Apple'][0]['success']:
            fruit1['Apple'] += 1
        if v['results']['Mango'][0]['success']:
            fruit1['Mango'] += 1

    if v['item'] == 'fruit2':
        if v['results']['Apple'][0]['success']:
            fruit2['Apple'] += 1
        if v['results']['Mango'][0]['success']:
            fruit2['Mango'] += 1


print 'fruit1: {}'.format(fruit1)
print 'fruit2: {}'.format(fruit2)

Chiqish:

fruit1: {'Mango': 1, 'Apple': 2}
fruit2: {'Mango': 0, 'Apple': 1}

Faqat mevalarning nomi har doim bir xil bo'lsa (meva1 va 2) va bular doimo Apple va mango. Lekin eng yaxshi narsa bu muhim emas, sizning domeningizda maqsadga erishish uchun bu erdan ishlashingiz mumkin. Bu biroz iflos va, albatta, optimal emas.

0
qo'shib qo'ydi

Ildizlangan lug'atlar jadvallar uchun yaxshi kirish bo'lganligi sababli pandalarni ishlatadigan qisqa yechim:

pan=pd.Panel.from_dict(info['data'])
def repl(s): return s['item'] if  ~isnan(s.id) and s.results[0]['success'] else None
df=pan.apply(repl,'minor')
sta=df.stack().reset_index()
cnt=sta.groupby(['level_0',0]).count().unstack().fillna(0).astype(int)     

Yakuniy natija ( cnt ):

         fruit1 fruit2               
Apple         2      1
Mango         1      0

Batafsil:

pan=pd.Panel.from_dict(info['data'])

Barcha keyinchalik avtomatik ravishda 3D tashkil etiladi:


Dimensions: 3 (items) x 2 (major_axis) x 3 (minor_axis)
Items axis: sample1 to sample3
Major_axis axis: Apple to Mango
Minor_axis axis: id to results 

Yaxshi mevalarni tanlash va 2D ga kamaytirish uchun endi funktsiyani belgilang:

def repl(s): return s['item'] if  ~isnan(s.id) and s.results[0]['success'] else None
df=pan.apply(repl,'minor')

uchun :

      sample1 sample2 sample3
Apple  fruit1  fruit1  fruit2
Mango  fruit1    None    None

Nihoyat 1D da qayta tashkil qiling:

sta=df.stack().reset_index()

None values are dropped:

  level_0  level_1       0
0   Apple  sample1  fruit1
1   Apple  sample2  fruit1
2   Apple  sample3  fruit2
3   Mango  sample1  fruit1

Va hisoblang:

cnt=sta.groupby(['level_0',0]).count().unstack().fillna(0).astype(int)     
0
qo'shib qo'ydi

Ildizlangan lug'atlar jadvallar uchun yaxshi kirish bo'lganligi sababli pandalarni ishlatadigan qisqa yechim:

pan=pd.Panel.from_dict(info['data'])
def repl(s): return s['item'] if  ~isnan(s.id) and s.results[0]['success'] else None
df=pan.apply(repl,'minor')
sta=df.stack().reset_index()
cnt=sta.groupby(['level_0',0]).count().unstack().fillna(0).astype(int)     

Yakuniy natija ( cnt ):

         fruit1 fruit2               
Apple         2      1
Mango         1      0

Batafsil:

pan=pd.Panel.from_dict(info['data'])

Barcha keyinchalik avtomatik ravishda 3D tashkil etiladi:


Dimensions: 3 (items) x 2 (major_axis) x 3 (minor_axis)
Items axis: sample1 to sample3
Major_axis axis: Apple to Mango
Minor_axis axis: id to results 

Yaxshi mevalarni tanlash va 2D ga kamaytirish uchun endi funktsiyani belgilang:

def repl(s): return s['item'] if  ~isnan(s.id) and s.results[0]['success'] else None
df=pan.apply(repl,'minor')

uchun :

      sample1 sample2 sample3
Apple  fruit1  fruit1  fruit2
Mango  fruit1    None    None

Nihoyat 1D da qayta tashkil qiling:

sta=df.stack().reset_index()

None values are dropped:

  level_0  level_1       0
0   Apple  sample1  fruit1
1   Apple  sample2  fruit1
2   Apple  sample3  fruit2
3   Mango  sample1  fruit1

Va hisoblang:

cnt=sta.groupby(['level_0',0]).count().unstack().fillna(0).astype(int)     
0
qo'shib qo'ydi

Masalan, siz xohlagan ma'lumotni olish uchun ko'p usullar mavjud

result={}
for sample in info["data"].values():
    name = sample["item"]
    inner = result.setdefault(name,{})
    for fruit, value in sample["results"].items():
        if value[0]["success"]:
            inner[fruit] = inner.get(fruit,0) + 1
print(result)

Izoh: Birinchidan, natijani qanday qo'lga kiritishga qaror qilamiz, bu holda men "fruit1", "fruit2" va boshqalar kabi kaliti "lug'at" ni tanladim va ularning qadriyatlari "Apple", "mango" , va hokazo. ichida topildi. So'ngra biz "ma'lumotlar" kalitining qiymatini hisobga olishni boshlaymiz, chunki kerakli ma'lumotga ega bo'lgan, keyin setdefault , biz birinchi navbatda mos keladigan nomning qiymati uchun dastlabki bo'sh ichki lug'atni o'rnatamiz va uni kod> o'zgarmaydigan, keyin biz mos keladigan natijalar (aka mevalari) ustida yineleyerek va get , shuning uchun biz birinchi marta hisoblash uchun 0

chiqdi

{'fruit1': {'Apple': 2, 'Mango': 1}, 'fruit2': {'Apple': 1}}

Bir marta buni qabul qilsangiz, siz bu erga borasiz, xohlagan tarzda chop etishingiz mumkin


bu bir xil jenerat ifodalarini va " kolleksiyalar modulidan foydalangan holda o'zgartirilishi mumkin.

from pprint import pprint
from collections import Counter, defaultdict

compact = ( (s["item"],( k for k,v in s["results"].items() if v[0]["success"] ) ) for s in info["data"].values())
result = defaultdict(Counter)
for k,v in compact:
    result[k].update(v)
pprint(result)    

chiqdi

defaultdict(,
            {'fruit1': Counter({'Apple': 2, 'Mango': 1}),
             'fruit2': Counter({'Apple': 1})})    
0
qo'shib qo'ydi

Masalan, siz xohlagan ma'lumotni olish uchun ko'p usullar mavjud

result={}
for sample in info["data"].values():
    name = sample["item"]
    inner = result.setdefault(name,{})
    for fruit, value in sample["results"].items():
        if value[0]["success"]:
            inner[fruit] = inner.get(fruit,0) + 1
print(result)

Izoh: Birinchidan, natijani qanday qo'lga kiritishga qaror qilamiz, bu holda men "fruit1", "fruit2" va boshqalar kabi kaliti "lug'at" ni tanladim va ularning qadriyatlari "Apple", "mango" , va hokazo. ichida topildi. So'ngra biz "ma'lumotlar" kalitining qiymatini hisobga olishni boshlaymiz, chunki kerakli ma'lumotga ega bo'lgan, keyin setdefault , biz birinchi navbatda mos keladigan nomning qiymati uchun dastlabki bo'sh ichki lug'atni o'rnatamiz va uni kod> o'zgarmaydigan, keyin biz mos keladigan natijalar (aka mevalari) ustida yineleyerek va get , shuning uchun biz birinchi marta hisoblash uchun 0

chiqdi

{'fruit1': {'Apple': 2, 'Mango': 1}, 'fruit2': {'Apple': 1}}

Bir marta buni qabul qilsangiz, siz bu erga borasiz, xohlagan tarzda chop etishingiz mumkin


bu bir xil jenerat ifodalarini va " kolleksiyalar modulidan foydalangan holda o'zgartirilishi mumkin.

from pprint import pprint
from collections import Counter, defaultdict

compact = ( (s["item"],( k for k,v in s["results"].items() if v[0]["success"] ) ) for s in info["data"].values())
result = defaultdict(Counter)
for k,v in compact:
    result[k].update(v)
pprint(result)    

chiqdi

defaultdict(,
            {'fruit1': Counter({'Apple': 2, 'Mango': 1}),
             'fruit2': Counter({'Apple': 1})})    
0
qo'shib qo'ydi
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming