0

I have this list:

my_list = [['ga:date'], ['ga:country', 'ga:date'], ['ga:country', 'ga:date']]

And try to iterate over it in order to get the values and its' positions, like so:

date    1
country 1
date    2
country 1
date    2

It should be later stored in a pandas df, values can be different, there is no fix.

Originally it was a list of dictionaries:

my_original_list = [
    [{'name': 'ga:date'}],
    [{'name': 'ga:country'}, {'name': 'ga:date'}],
    [{'name': 'ga:country'}, {'name': 'ga:date'}]
]

# But I got the values out of it in a list:
my_list = [li['name'] for li in my_original_list]

# the result
my_list = [
    ['ga:date'], 
    ['ga:country', 'ga:date'],
    ['ga:country', 'ga:date']
]

Cracked my mind already how to get it, would appreciate any help

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
Anna
  • 914
  • 9
  • 25

3 Answers3

3

Use list comprehension with enumerate and flattening for list of tuples:

my_list = [['ga:date'], ['ga:country', 'ga:date'], ['ga:country', 'ga:date']]

x = [(b, a) for i in my_list for (a, b) in enumerate(i, 1)]
print (x)
[('ga:date', 1), ('ga:country', 1), ('ga:date', 2), ('ga:country', 1), ('ga:date', 2)]

df = pd.DataFrame(x, columns = ['field','listIndex'])
print (df)
        field  listIndex
0     ga:date          1
1  ga:country          1
2     ga:date          2
3  ga:country          1
4     ga:date          2

Or if possible change position of columns:

x1 = [z for i in my_list for z in enumerate(i, 1)]
print (x1)
[(1, 'ga:date'), (1, 'ga:country'), (2, 'ga:date'), (1, 'ga:country'), (2, 'ga:date')]

df = pd.DataFrame(x1, columns = ['listIndex','field'])
print (df)
   listIndex       field
0          1     ga:date
1          1  ga:country
2          2     ga:date
3          1  ga:country
4          2     ga:date

Also if need remove values before ::

my_list = [['ga:date'], ['ga:country', 'ga:date'], ['ga:country', 'ga:date']]

x = [(b.split(':')[-1], a) for i in my_list for (a, b) in enumerate(i, 1)]
print (x)
[('date', 1), ('country', 1), ('date', 2), ('country', 1), ('date', 2)]

df = pd.DataFrame(x, columns = ['field','listIndex'])
print (df)
     field  listIndex
0     date          1
1  country          1
2     date          2
3  country          1
4     date          2
jezrael
  • 822,522
  • 95
  • 1,334
  • 1,252
1

You can use enumerate for this:

my_list = [['ga:date'], ['ga:country', 'ga:date'], ['ga:country', 'ga:date']]

for sublist in my_list:
    for position, entry in enumerate(sublist):
        print(entry, position + 1)  # +1 to count positions starting at 1 instead of 0.
Finn
  • 1,999
  • 2
  • 24
  • 29
1

How about this?

import pandas

my_list = [['ga:date'], ['ga:country', 'ga:date'], ['ga:country', 'ga:date']]
df = pandas.DataFrame(data=[(sublist[i],i) for sublist in my_list for i in range(len(sublist))], columns=["field", "listIndex"])

REsult:

        field  listIndex
0     ga:date          0
1  ga:country          0
2     ga:date          1
3  ga:country          0
4     ga:date          1
Artur
  • 407
  • 2
  • 8