How to transform string of space-separated key,val

2019-01-08 00:37发布

I've got a string with words that are separated by spaces (all words are unique, no duplicates). I turn this string into list:

s = "#one cat #two dogs #three birds"
out = s.split()

And count how many values are created:

print len(out) # Says 192 

Then I try to delete everything from the list:

for x in out:
     out.remove(x)

And then count again:

print len(out) # Says 96 

Can someone explain please why it says 96 instead of 0?

MORE INFO

Each line starts with '#' and is in fact a space-separated pair of words: the first in the pair is the key and second is the value.

So, what I am doing is:

for x in out:
     if '#' in x: 
          ind = out.index(x) # Get current index 
          nextValue = out[ind+1] # Get next value 
          myDictionary[x] = nextValue
          out.remove(nextValue)
          out.remove(x) 

The problem is I cannot move all key,value-pairs into a dictionary since I only iterate through 96 items.

9条回答
在下西门庆
2楼-- · 2019-01-08 01:18

You're not being specific. Why are you trying to delete everything in the out-list? Any if all you need to do is clear the out-list, why not just do this:

out = []
查看更多
唯我独甜
3楼-- · 2019-01-08 01:21

I think you actually want something like this:

s = '#one cat #two dogs #three birds'
out = s.split()
entries = dict([(x, y) for x, y in zip(out[::2], out[1::2])])

What is this code doing? Let's break it down. First, we split s by whitespace into out as you had.

Next we iterate over the pairs in out, calling them "x, y". Those pairs become a list of tuple/pairs. dict() accepts a list of size two tuples and treats them as key, val.

Here's what I get when I tried it:

$ cat tryme.py

s = '#one cat #two dogs #three birds'
out = s.split()
entries = dict([(x, y) for x, y in zip(out[::2], out[1::2])])

from pprint import pprint
pprint(entries)

$ python tryme.py
{'#one': 'cat', '#three': 'birds', '#two': 'dogs'}
查看更多
不美不萌又怎样
4楼-- · 2019-01-08 01:35

I believe you want following.

>>> a = '#one cat #two dogs #three birds'
>>> b = { x.strip().split(' ')[0] : x.strip().split(' ')[-1] for x in a.strip().split('#') if len(x) > 0 }
>>> b
{'three': 'birds', 'two': 'dogs', 'one': 'cat'}

Or even better

>>> b = [ y   for x in a.strip().split('#') for y in x.strip().split(' ') if len(x) > 0 ]
>>> c = { x: y for x,y  in zip(b[0::2],b[1::2]) }
>>> c
{'three': 'birds', 'two': 'dogs', 'one': 'cat'}
>>> 
查看更多
登录 后发表回答