тізімде тек бір рет пайда болған элементтерді қалай есептеп шығаруға болады

Егер менде сөздік бар болса {key: [abccd]} және әр кілтке сәйкес келетін бірегей мәндерді ғана басып шығарғым келеді (Бұл жағдайда (a, b, d)) бұл әдісті тек әділ әр элемент арқылы циклды және оның есебін жүргізу керек пе?

3
Жоқ, мен дәл басып шығаруды ғана білдірмедім (a, b, d). Мен c басып шығарғым келмейді.
қосылды автор vkaul11, көзі
@Rhymoid Мен ерекшелендіруді сұраймын 8)
қосылды автор 2rs2ts, көзі
@Rhymoid Мен келісемін, бірақ бұл мүмкін емес. :)
қосылды автор 2rs2ts, көзі
Менің ойымша, ОП мәселесі өте айқын және айқын болды. Есепке алынбайды және бірегей ғана элементтер (тек бір рет кездеседі). Тізімдегі әрбір элемент, телнұсқаларды қоспағанда.
қосылды автор 2rs2ts, көзі
қосылды автор Martijn Pieters, көзі
Осындай (елдік) талаптарға сай, сізде не үшін бар екенін түсіндіру әрқашан пайдалы. Counter пайдалану кезінде қандай проблема бар?
қосылды автор Thijs van Dien, көзі
Бұл жағдайда (a, b, c, d) дегенді білдіртпейсіз бе?
қосылды автор arshajii, көзі
сен не істейсің?
қосылды автор Arnaldo Ignacio Gaspar Vé, көзі
@ 2rs2ts: <= астындағы [0, 1, many] торында санау мүмкін емес. Мысалы, a [a, b, c, d, a] бірегей емес, бірақ әрқашан a тізімде пайда болады (суб-жауаптарды біріктіргеніңізге қарамастан). Бірдей элементтер әрдайым бір-бірімен кездесетін тізімдермен емес, тек әрқайсысының ұзақтығын есептеуге тура келеді, ол үшін тек тұрақты кеңістік қажет.
қосылды автор user824425, көзі
Егер тізімде көп шектеулер болмаса, есептелмей жасалмайды. Сұрыпталып/бөлуге кепілдік беріле ме?
қосылды автор user824425, көзі

7 жауаптар

3
қосылды
Спасибо Sebastian сіздің ұштық.
қосылды автор vkaul11, көзі
@ vkaul11, егер сіз осы жолмен жүрсеңіз, сіз тек «» .join (...) бөлігін алып тастап, тізімді ала аласыз.
қосылды автор 2rs2ts, көзі

One option, use collections.Counter

from collections import Counter
d = {'k': ['a', 'b', 'c', 'c', 'd']}
c = Counter(d['k'])
print [k for k in c if c[k] == 1]
['a', 'b', 'd']
2
қосылды
@ 1_CR кем дегенде менің сұрағым үшін алғыс айтамыз. Мен өз сұрағымды тіпті түсінбейтін адамдардан да төмен түсірдім.
қосылды автор vkaul11, көзі
@ vkaul11 Мен өтемақы үшін көтерді. Менің ойымша, бұл мәселе сіз үшін қиын жағдайға тап болғанымен, заңды және анық айтылған. Python Counter-ге қолдануға және Counter-ны қолдануға арналған. : Р
қосылды автор 2rs2ts, көзі
ОР есеп айырысуды қаламады.
қосылды автор 2rs2ts, көзі
Егер Counter үшін бастапқы кодты оқыған болсаңыз, ол тек «әрбір элемент арқылы айналдыру және оның санағын сақтау» болып табылады, ол ОР келмейді.
қосылды автор Aya, көзі

Python-де, әр пернедегі бірегей элементтерді табу үшін жиынты пайдалануға болады (жинақта қайталанатын элементтер болмайды), содан кейін жиынды қайта тізімге айналдырыңыз

for key in dict:
    print list(set(dict[key]))
2
қосылды
Мен (a, b, c, c, d) тізімдерде (a, b, d) басып шығарғым келеді және басып шығармаған тек жоғарыда айтылғандай бірегей болып табылатын элементтерді ғана басып шығарғым келеді.
қосылды автор vkaul11, көзі

Counter пайдаланбаған:

unique = []
for i, val in enumerate(d['key']):
    if item not in d['key'][i+1:] and item not in d['key'][:i]:
        unique.append(item)

Генераторды түсіну:

unique = list((d['key'][i] for i in range(len(d['key'])) if d['key'][i] not in d['key'][i+1:] and d['key'][i] not in d['key'][:i]))
0
қосылды
Өте инновациялық шешім деп айтуға тиіспін.
қосылды автор vkaul11, көзі
@Aya ah, жеткілікті әділ! Менің қадағалауым. Мен бәрібір санауды өз бетіммен пайдаланғым келеді, бірақ ОР-дың орнына не істеу керектігін айтып бермеймін, керісінше, ол сұраған нәрсені қалай істеу керектігін айт.
қосылды автор 2rs2ts, көзі
@Aя, менің бірінші бөлімді O (n ^ 2) етеді? Нөмірлеуді қолдану?
қосылды автор 2rs2ts, көзі
Ештене етпейді. Мен редакциялауды және түсінікті қосуды жоспарлап отырмын ...
қосылды автор 2rs2ts, көзі
Бұл алгоритм O (n²) болып табылады, ол O (n) деген Counter функциясын пайдаланудан кем тиімді.
қосылды автор Aya, көзі
@Maxime Жақсы, сұрыптау O (n log n) уақыттың күрделілігін қосады, ол сіз жасай аласыз.
қосылды автор Aya, көзі
@ 2rs2ts элементі d емес ['key'] [i + 1:] тізімнің O (n) іздеуін жасайды.
қосылды автор Aya, көзі
Алдыңғы және алдыңғы мәнді ғана тексере алу үшін сұрыптау туралы не айтасыз?
қосылды автор Maxime Chéramy, көзі
Ия, өкінішті, бұл сіздің пікіріңізге жауап емес еді. Сіз, ең алдымен, дұрыс деп санайсыз, Есептегіш әрқашан жақсы шешім болуы мүмкін. Дәлірек айтқанда, күрделілік O (n ^ 2) -дан бұрынғыдан да жақсы болар еді және ОС сұрағандай санау әлі де болмайды.
қосылды автор Maxime Chéramy, көзі

collections ішінен Counter қолдануға болады:

>>> d = {'key': ['a', 'b', 'c', 'c', 'd']}
>>> 
>>> from collections import Counter
>>> 
>>> new_dict = Counter(d['key'])
>>> new_dict
Counter({'c': 2, 'a': 1, 'b': 1, 'd': 1})
>>> [elem for elem in new_dict.keys() if new_dict[elem] == 1]
['a', 'b', 'd']
0
қосылды
ОП тек бір рет қамтылған элементтерді табуға тырысады.
қосылды автор 2rs2ts, көзі
Мен оны бағалаймын, мен педантты болуды жек көремін, бірақ ОР-да санауды сұрадым.
қосылды автор 2rs2ts, көзі
@ 2rs2ts. Ия шатастырылды. Жаңартылған жауап.
қосылды автор Rohit Jain, көзі

Тізімді сұрыптағанда:

>>> L = [1, 1, 2, 3, 4, 4, 4, 5]
>>> [e for i, e in enumerate(L) if e == L[i-1] and i < len(L)-1 and not e == L[i+1]]
[1, 4]
0
қосылды

Әрбір тізімдегі барлық бірегей элементтерді табу үшін set() қолдануға болады.

for key in mydict:
    uniques = set(mydict[key])
0
қосылды
Тағы да, бірегей элементтерді басып шығарғым келеді және қайталанатын элементтерді мүлдем басып шығармаймын. Мұнда барлық элементтерді басып шығарасыз, бірақ сіз тек көшірмелерді бір рет басып шығарасыз.
қосылды автор vkaul11, көзі
Сіз тек бір рет пайда болатын элементтерді басып шығарғыңыз келеді. Бұл бірегей элементтер тізімін басып шығарудан өзгеше.
қосылды автор FastTurtle, көзі