मेरे पास सूचियों की एक सूची है जिसे मैं बाद में एक शब्दकोश में बदलना चाहता हूं। समस्या यह है कि सूचियों की सूची बहुत अनियमित है: एक कुंजी के लिए उस कुंजी से संबंधित संख्याओं वाली 1 और 4 सूचियों के बीच मौजूद है। मूल डेटा सेट एक json में संग्रहीत किया जाता है। यह एक उदाहरण डेटा सेट है:

data = [36146779,
[17628,35633, 2847385, 71393, 41814],[51068348,49722,3255134,66598],[103475099, 1337536, 1136863360,257],
22971125,
[230806,116805,118456,9031, 3573662],[719279707,299836,40722,35134,668],[1337536, 1136863360,257],
111125168,
[719279707,299836,40722,35138],[17628,35633, 2847385],
71280747,
[806,116805,11845],[17628,35633, 2847385]]

मैं सूचियों की सूची को पूरी तरह से समतल करने में सक्षम था, लेकिन मैं इस फ्लैट सूची को दिए गए कुंजियों के साथ एक शब्दकोश में बदल रहा हूं

ex_eco = ["36146779","22971125","111125168","71280747"]

(मुझे यकीन है कि पहली नेस्टेड सूची को सीधे एक शब्दकोश में बदलना भी संभव है लेकिन मुझे कोई समाधान नहीं मिला इसलिए मैंने इसे इस तरह से आजमाया)

def flatten(l):
  out = []
  for item in l:
    if isinstance(item, (list, tuple)):
      out.extend(flatten(item))
    else:
      out.append(item)
  return out

flattened_eco = flatten(data)

print(flattened_eco[0:100])

मुझे जो मिलता है वह एक सपाट सूची है:

[36146779, 17628, 35633, 2847385, 71393, 41814, 51068348, 49722, 3255134, 66598, 103475099, 1337536, 1136863360, 257, 22971125, 230806, 116805, 118456, 9031, 3573662, 719279707, 299836, 40722, 35134, 668, 1337536, 1136863360, 257, 111125168, 719279707, 299836, 40722, 35138, 17628, 35633, 2847385, 71280747, 806, 116805, 11845, 17628, 35633, 2847385]

मुझे जो चाहिए वह कुछ ऐसा है:

[36146779,
[17628,35633, 2847385, 71393,41814,51068348,49722,3255134,66598,103475099,1337536, 1136863360,257],
22971125,
[230806,116805,118456,9031,573662,719279707,299836,40722,35134,668,1337536, 1136863360,257],
111125168,
[719279707,299836,40722,35138,17628,35633, 2847385],
71280747,
[806,116805,11845,17628,35633, 2847385]
]
1
Theresa S 22 जुलाई 2019, 14:53

4 जवाब

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

def flatten(data):
    flattened = []
    for key, value in itertools.groupby(data, type):
        if key == int:
            flattened.append(next(value))
        else:
            flattened.append(list(itertools.chain.from_iterable(value)))
    return flattened

उदाहरण

>>> data = [36146779,
            [17628,35633, 2847385, 71393, 41814],[51068348,49722,3255134,66598],[103475099, 1337536, 1136863360,257],
            22971125,
            [230806,116805,118456,9031, 3573662],[719279707,299836,40722,35134,668],[1337536, 1136863360,257],
            111125168,
            [719279707,299836,40722,35138],[17628,35633, 2847385],
            71280747,
            [806,116805,11845],[17628,35633, 2847385]]

>>> flatten(data)
[36146779, 
 [17628, 35633, 2847385, 71393, 41814, 51068348, 49722, 3255134, 66598, 103475099, 1337536, 1136863360, 257],
 22971125,
 [230806, 116805, 118456, 9031, 3573662, 719279707, 299836, 40722, 35134, 668, 1337536, 1136863360, 257],
 111125168,
 [719279707, 299836, 40722, 35138, 17628, 35633, 2847385],
 71280747,
 [806, 116805, 11845, 17628, 35633, 2847385]]

इसे एक कदम आगे ले जाने के लिए और एक शब्दकोश बनाने के लिए, फ़ंक्शन की अंतिम पंक्ति को dict समझ में बदलें

def dictify(data):
    flattened = []
    for key, value in itertools.groupby(data, type):
        if key == int:
            flattened.append(next(value))
        else:
            flattened.append(list(itertools.chain.from_iterable(value)))
    return {key:value for key,value in zip(flattened[::2], flattened[1::2])}

>>> dictify(data)
{36146779: [17628, 35633, 2847385, 71393, 41814, 51068348, 49722, 3255134, 66598, 103475099, 1337536, 1136863360, 257],
 22971125: [230806, 116805, 118456, 9031, 3573662, 719279707, 299836, 40722, 35134, 668, 1337536, 1136863360, 257],
 111125168: [719279707, 299836, 40722, 35138, 17628, 35633, 2847385],
 71280747: [806, 116805, 11845, 17628, 35633, 2847385]}
2
Cory Kramer 22 जुलाई 2019, 15:03

आपके इनपुट से ऐसा लगता है कि आपको पुनरावर्ती फ़ंक्शन की आवश्यकता नहीं है, बस एक पुनरावृत्ति का उपयोग करें:

result = {}
keys = []
for d in data:
  if type(d) == int:
    result[d] = []
    keys.append(d)
  else:
    result[keys[-1]] += d

प्रदान किए गए डेटा का उपयोग कर आउटपुट:

{36146779: [17628, 35633, 2847385, 71393, 41814, 51068348, 49722, 3255134, 66598, 103475099, 1337536, 1136863360, 257], 22971125: [230806, 116805, 118456, 9031, 3573662, 719279707, 299836, 40722, 35134, 668, 1337536, 1136863360, 257], 111125168: [719279707, 299836, 40722, 35138, 17628, 35633, 2847385], 71280747: [806, 116805, 11845, 17628, 35633, 2847385]}
1
Vanojx1 22 जुलाई 2019, 15:04
  • विस्तार()- का उपयोग दो सूचियों को मिलाने के लिए किया जाता है।

उदा.

data = [36146779,
[17628,35633, 2847385, 71393, 41814],[51068348,49722,3255134,66598],[103475099, 1337536, 1136863360,257],
22971125,
[230806,116805,118456,9031, 3573662],[719279707,299836,40722,35134,668],[1337536, 1136863360,257],
111125168,
[719279707,299836,40722,35138],[17628,35633, 2847385],
71280747,
[806,116805,11845],[17628,35633, 2847385]]

new_dict = {}
temp=None
for x in data:
    if not isinstance(x, list):
        new_dict[x] = []
        temp = x
    else:
        new_dict[temp].extend(x)

print(new_dict)

ओ/पी:

{36146779: [17628, 35633, 2847385, 71393, 41814, 51068348, 49722, 3255134, 66598, 103475099, 1337536, 1136863360, 257], 22971125: [230806, 116805, 118456, 9031, 3573662, 719279707, 299836, 40722, 35134, 668, 1337536, 1136863360, 257], 111125168: [719279707, 299836, 40722, 35138, 17628, 35633, 2847385], 71280747: [806, 116805, 11845, 17628, 35633, 2847385]}
1
bharatk 22 जुलाई 2019, 15:10

itertools.groupby का उपयोग करने वाला एक संस्करण:

data = [36146779,
[17628,35633, 2847385, 71393, 41814],[51068348,49722,3255134,66598],[103475099, 1337536, 1136863360,257],
22971125,
[230806,116805,118456,9031, 3573662],[719279707,299836,40722,35134,668],[1337536, 1136863360,257],
111125168,
[719279707,299836,40722,35138],[17628,35633, 2847385],
71280747,
[806,116805,11845],[17628,35633, 2847385]]

from itertools import groupby

def generate(d):
    for v, g in groupby(d, lambda k: isinstance(k, (tuple, list))):
        if not v:
            yield from g
        else:
            yield sum(g, [])

from pprint import pprint
pprint([*generate(data)], width=180)

प्रिंट:

[36146779,
 [17628, 35633, 2847385, 71393, 41814, 51068348, 49722, 3255134, 66598, 103475099, 1337536, 1136863360, 257],
 22971125,
 [230806, 116805, 118456, 9031, 3573662, 719279707, 299836, 40722, 35134, 668, 1337536, 1136863360, 257],
 111125168,
 [719279707, 299836, 40722, 35138, 17628, 35633, 2847385],
 71280747,
 [806, 116805, 11845, 17628, 35633, 2847385]]
0
Andrej Kesely 22 जुलाई 2019, 16:26