Pythonda xaritani qanday ishlatish/qisqartirish Buyurtma lug'atga

Bu kabi ichki python lug'ati bor:

my_dictionary = {"Ab" : {'name': 'usa', 'boolean': 'YES'},
"Ac" : {'name': 'usa', 'boolean': 'NO'},
"Ad": {'name': 'UK', 'boolean': 'NO'},
"Ae": {'name': 'UK', 'boolean': 'NO'}}

Yuqoridagi lug'atdan shunday tartibli lug'atlarni yaratdim:

from collections import OrderedDict
sorted_dict = OrderedDict(sorted(my_dictionary.iteritems(), key=lambda x: x[1]['name']))
print sorted_dict

Bu quyidagilarni beradi:

OrderedDict([("Ab", {'name': 'usa', 'boolean': 'YES'}),
("Ac", {'name': 'usa', 'boolean': 'NO'}),
("Ad", {'name': 'UK', 'boolean': 'NO'}),
("Ae", {'name': 'UK', 'boolean': 'NO'})])

Buyurtma lug'atga yangi ustun ('natija') kiritish kerak. Yangi ustunni yaratish mantig'i quyidagicha:

Xuddi shu "ismga" ega bo'lgan barcha qatorlarni to'plash: bu erda "usa" va "UK". Keyin 'boolean' ustuniga asoslangan usulni kamaytiring. Funktsiya ikki tomonlama "OR" (||) bo'lishi kerak.

Men shunga o'xshash kamaytirishni qo'lladim:

reduce(lambda x,y: x['boolean'] or y['boolean']

biroq "ism" bilan barcha satrlarni tanlashga qat'iy rioya qildilar.

Shunday qilib, oxirgi Buyurtma lug'ati quyidagicha ko'rinadi:

OrderedDict([("Ab", {'name': 'usa', 'boolean': 'YES', 'result': 'YES'}),
("Ac", {'name': 'usa', 'boolean': 'NO', 'result': 'YES'}),
("Ad", {'name': 'UK', 'boolean': 'NO', 'result': 'NO'}),
("Ae", {'name': 'UK', 'boolean': 'NO', 'result': 'NO'})])
0
sorted -ni o'zgarmaydigan nomingizdan foydalanmang, ichki sorted usulini soya qiladi va sizda muammolarga olib kelishi mumkin.
qo'shib qo'ydi muallif Inbar Rose, manba
sorted -ni o'zgarmaydigan nomingizdan foydalanmang, ichki sorted usulini soya qiladi va sizda muammolarga olib kelishi mumkin.
qo'shib qo'ydi muallif Inbar Rose, manba
Pandas paketidan dataframlardan foydalanish haqida nima deyish mumkin?
qo'shib qo'ydi muallif Elmex80s, manba
@ Elmex80s: "Ha". Endi tahrirlangan :-) Iltimos, savolni yanada kengroq ko'rish uchun yuqoriga ko'taring :-)
qo'shib qo'ydi muallif user3683555, manba
@ Elmex80s: "Ha". Endi tahrirlangan :-) Iltimos, savolni yanada kengroq ko'rish uchun yuqoriga ko'taring :-)
qo'shib qo'ydi muallif user3683555, manba
@InbarRose: rahmat. Endi tahrirlangan
qo'shib qo'ydi muallif user3683555, manba
@ Elmex80s: Men ham bu haqda o'ylagan edim. Lekin, bu sof bir python kodbaza ichiga integratsiya mumkin. Men pandalarni faqat noutbukda ishlatgan edim
qo'shib qo'ydi muallif user3683555, manba
@ Elmex80s: Men ham bu haqda o'ylagan edim. Lekin, bu sof bir python kodbaza ichiga integratsiya mumkin. Men pandalarni faqat noutbukda ishlatgan edim
qo'shib qo'ydi muallif user3683555, manba

7 javoblar

Håsås siz taqdim etgan ma'lumotlar bilan ishlaydigan usuli, lekin men buni qisqartirish bilan qanday bog'liqligini bilmayman.

from collections import OrderedDict, defaultdict

d = OrderedDict([("Ab", {'name': 'usa', 'boolean': 'YES'}),
                 ("Ac", {'name': 'usa', 'boolean': 'NO'}),
                 ("Ad", {'name': 'UK', 'boolean': 'NO'}),
                 ("Ae", {'name': 'UK', 'boolean': 'NO'})])


def add_result(d, ikey='name', check='boolean', tt='YES', ff='NO'):
    # hold results per ikey
    ikey_results = defaultdict(lambda: ff)
    # first pass to get results
    for v in d.values():
        if v[check] == tt:
            ikey_results[v[ikey]] = tt
    # second pass to embedd results
    for v in d.values():
        v['result'] = ikey_results[v[ikey]]
    return d

print add_result(d)

Yutuqlar

OrderedDict([('Ab', {'boolean': 'YES', 'name': 'usa', 'result': 'YES'}),
             ('Ac', {'boolean': 'NO', 'name': 'usa', 'result': 'YES'}), 
             ('Ad', {'boolean': 'NO', 'name': 'UK', 'result': 'NO'}), 
             ('Ae', {'boolean': 'NO', 'name': 'UK', 'result': 'NO'})])
1
qo'shib qo'ydi
Bu javob, albatta, to'g'ri. Boshqalarni ham nazorat qilish
qo'shib qo'ydi muallif user3683555, manba

Håsås siz taqdim etgan ma'lumotlar bilan ishlaydigan usuli, lekin men buni qisqartirish bilan qanday bog'liqligini bilmayman.

from collections import OrderedDict, defaultdict

d = OrderedDict([("Ab", {'name': 'usa', 'boolean': 'YES'}),
                 ("Ac", {'name': 'usa', 'boolean': 'NO'}),
                 ("Ad", {'name': 'UK', 'boolean': 'NO'}),
                 ("Ae", {'name': 'UK', 'boolean': 'NO'})])


def add_result(d, ikey='name', check='boolean', tt='YES', ff='NO'):
    # hold results per ikey
    ikey_results = defaultdict(lambda: ff)
    # first pass to get results
    for v in d.values():
        if v[check] == tt:
            ikey_results[v[ikey]] = tt
    # second pass to embedd results
    for v in d.values():
        v['result'] = ikey_results[v[ikey]]
    return d

print add_result(d)

Yutuqlar

OrderedDict([('Ab', {'boolean': 'YES', 'name': 'usa', 'result': 'YES'}),
             ('Ac', {'boolean': 'NO', 'name': 'usa', 'result': 'YES'}), 
             ('Ad', {'boolean': 'NO', 'name': 'UK', 'result': 'NO'}), 
             ('Ae', {'boolean': 'NO', 'name': 'UK', 'result': 'NO'})])
1
qo'shib qo'ydi
Bu javob, albatta, to'g'ri. Boshqalarni ham nazorat qilish
qo'shib qo'ydi muallif user3683555, manba

Sizga biroz yordam beray:

  1. siz kiritgan tartibli lug'at bu erda muhim emas.
  2. Agar siz uni tashlab, uni tanitishingiz mumkin

  3. Dastlabki "Ha" kodini To'g'ri va "No" kodini False ga o'zgartiraman . Hayotni osonlashtir, murakkab emas,
  4. Siz lambda holda ishlating va kamaytiring . Python har qanday iborasi bilan birga ro'yxatni tushunishga ega. any Boolean yoki operatorini Boolean qiymatlari ro'yxatiga qo'llaydi.
1
qo'shib qo'ydi
@ user3683555 Rahmat sizga, lekin birinchi va uchinchi nuqta ham qimmat bo'lishi mumkin.
qo'shib qo'ydi muallif Elmex80s, manba
Men sizning ikkinchi fikringizni yaxshi ko'raman. Birinchi nuqta uchun: menda shunga o'xshash ustunlar bor. Bu eng oddiy versiya. Men uni bir marta saralashni o'yladim, "nom" ustunidagi bir xil qiymatlarga ega bo'lgan qatorlarni egallashim kerak.
qo'shib qo'ydi muallif user3683555, manba

Sizga biroz yordam beray:

  1. siz kiritgan tartibli lug'at bu erda muhim emas.
  2. Agar siz uni tashlab, uni tanitishingiz mumkin

  3. Dastlabki "Ha" kodini To'g'ri va "No" kodini False ga o'zgartiraman . Hayotni osonlashtir, murakkab emas,
  4. Siz lambda holda ishlating va kamaytiring . Python har qanday iborasi bilan birga ro'yxatni tushunishga ega. any Boolean yoki operatorini Boolean qiymatlari ro'yxatiga qo'llaydi.
1
qo'shib qo'ydi
@ user3683555 Rahmat sizga, lekin birinchi va uchinchi nuqta ham qimmat bo'lishi mumkin.
qo'shib qo'ydi muallif Elmex80s, manba
Men sizning ikkinchi fikringizni yaxshi ko'raman. Birinchi nuqta uchun: menda shunga o'xshash ustunlar bor. Bu eng oddiy versiya. Men uni bir marta saralashni o'yladim, "nom" ustunidagi bir xil qiymatlarga ega bo'lgan qatorlarni egallashim kerak.
qo'shib qo'ydi muallif user3683555, manba

Bu

from pprint import pprint

my_dictionary = {"Ab": {'name': 'usa', 'boolean': True},
                 "Ac": {'name': 'usa', 'boolean': False},
                 "Ad": {'name': 'UK', 'boolean': False},
                 "Ae": {'name': 'UK', 'boolean': False}}

sub_result = dict()

for x in my_dictionary.values():
    country_name = x['name']
    sub_result[country_name ] = sub_result.get(country_name , False) or x['boolean']


new_dictionary = {k: dict(v.items() + [('result', sub_result[v['name']])]) for k, v in my_dictionary.items()}


pprint(new_dictionary)

Buyurtma lug'atga kerak emas.

1
qo'shib qo'ydi
Ha, lekin siz eski narsalarni yo'q qildingiz va yangisini yaratdingiz. OP o'shanda xohlagan IMHO.
qo'shib qo'ydi muallif Inbar Rose, manba
@InbarRose Bunday holda lug'at tushunchasini olib tashlang va uni for loop bilan almashtiring.
qo'shib qo'ydi muallif Elmex80s, manba
@ Elmex80s: Bu yechim ham to'g'ri.
qo'shib qo'ydi muallif user3683555, manba

Men buni yaxshi qabul qilishimga ishonchim komil emas. Lekin umid qilamanki, bu siz izlayotgan narsa.

from functools import reduce
from itertools import groupby


def reduceByKey(func, iterable): 
    return map(              
      lambda l: (l[0], reduce(func, map(lambda p: p[1], l[1]))),
      groupby(sorted(iterable, key=lambda p: p[0]), lambda p: p[0])
    )

reduceByKey(
  # Are you sure you want to do ("YES" or "NO") not (True or False) ?
  lambda x, y: x or y
  map(lambda d: yourDict[d]["name"], yourDict[d]["boolean"], yourDict)
)

yourDict here is your original dictionary

1
qo'shib qo'ydi

Men buni yaxshi qabul qilishimga ishonchim komil emas. Lekin umid qilamanki, bu siz izlayotgan narsa.

from functools import reduce
from itertools import groupby


def reduceByKey(func, iterable): 
    return map(              
      lambda l: (l[0], reduce(func, map(lambda p: p[1], l[1]))),
      groupby(sorted(iterable, key=lambda p: p[0]), lambda p: p[0])
    )

reduceByKey(
  # Are you sure you want to do ("YES" or "NO") not (True or False) ?
  lambda x, y: x or y
  map(lambda d: yourDict[d]["name"], yourDict[d]["boolean"], yourDict)
)

yourDict here is your original dictionary

1
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