Dylan Grove
Dylan Grove

Reputation: 523

python Split list based on delimiting list value

I've dug through countless other questions but none of them seem to work for me. I've also tried a ton of different things but I don't understand what I need to do. I don't know what else to do.

list:

split_me = ['this', 'is', 'my', 'list', '--', 'and', 'thats', 'what', 'it', 'is!', '--', 'Please', 'split', 'me', 'up.']

I need to:

So it becomes this:

this=['this', 'is', 'my', 'list']
and=['and', 'thats', 'what', 'it', 'is!']
please=['Please', 'split', 'me', 'up.']

current attempt (Work in progress):

for value in split_me:
    if firstrun:
        newlist=list(value)
        firstrun=False
        continue

    if value == "--":
        #restart? set firstrun to false?
        firstrun=False
        continue
    else:
        newlist.append(value)

print(newlist)

Upvotes: 0

Views: 82

Answers (4)

AGN Gazer
AGN Gazer

Reputation: 8388

This will actually create global variables named the way you want them to be named. Unfortunately it will not work for Python keywords such as and and for this reason I am replacing 'and' with 'And':

split_me = ['this', 'is', 'my', 'list', '--', 'And', 'thats', 'what', 'it',
'is!', '--', 'Please', 'split', 'me', 'up.']       

new = True
while split_me:
    current = split_me.pop(0)
    if current == '--':
        new = True
        continue
    if new:
        globals()[current] = [current]
        newname = current
        new = False
        continue
    globals()[newname].append(current)

A more elegant approach based on @Mangohero1 answer would be:

from itertools import groupby
dash = '--'
phrases = [list(y) for x, y in groupby(split_me, lambda z: z == dash) if not x]
for l in phrases:
    if not l:
        continue
    globals()[l[0]] = l

Upvotes: 2

FreshPow
FreshPow

Reputation: 7244

I would try something ike

" ".join(split_me).split(' -- ') # as a start

Upvotes: 1

Mangohero1
Mangohero1

Reputation: 1912

Utilizing itertools.groupby():

dash = "--"
phrases = [list(y) for x, y in groupby(split_me, lambda z: z == dash) if not x]

Initialize a dict and map each list to the first word in that list:

myDict = {}
for phrase in phrases:
    myDict[phrase[0].lower()] = phrase

Which will output:

{'this': ['this', 'is', 'my', 'list]
 'and': ['and', 'thats', 'what', 'it', 'is!']
 'please': ['Please', 'split', 'me', 'up.'] }

Upvotes: 2

Ronald
Ronald

Reputation: 2882

This more or less works, although I had to change words to solve the reserved word problem. (Bad idea to call a variable 'and').

split_me = ['This', 'is', 'my', 'list', '--', 'And', 'thats', 'what', 'it', 'is!', '--', 'Please', 'split', 'me', 'up.']

    retval = []
    actlist = []

    for e in split_me:
            if (e == '--'):
                    retval.append(actlist)
                    actlist = []
                    continue
            actlist.append(e)

    if len(actlist) != 0:
            retval.append(actlist)

    for l in retval:
            name = l[0]
            cmd = name + " = " + str(l)
            exec( cmd )

    print This
    print And
    print Please

Upvotes: 2

Related Questions