Home > Software design >  Python 2D list slicing where one list is full of empty strings
Python 2D list slicing where one list is full of empty strings

Time:09-21

So say I have a 2D list like:

[
  [
    "9743",
    "user3"
  ],
  [
    "435",
    "user2"
  ],
  [
    "5426",
    "user8"
  ],
  [
    "",
    ""
  ],
  [
    "9743",
    "user9"
  ]
]

Where the index of that list of empty strings is unknown. Is there an easy way to slice the list so that everything after and including that list with empty strings is removed just keeping the stuff before it?

CodePudding user response:

If you are sure that you have ['',''] try this:

lst = [[ "9743", "user3"],[ "435","user2"],["5426","user8"],["",""],["9743","user9"]]

lst[:lst.index(['',''])]
# Output
# [['9743', 'user3'], ['435', 'user2'], ['5426', 'user8']]

If you are not sure that you have ['',''] try this:

lst = [[ "9743", "user3"],[ "435","user2"],["5426","user8"],["9743","user9"]]
try:
    out = lst[:lst.index(['',''])]
except ValueError:
    out = lst

Output:

[['9743', 'user3'], ['435', 'user2'], ['5426', 'user8'], ['9743', 'user9']]

CodePudding user response:

You can use itertools.takewhile:

from itertools import takewhile
list(takewhile(lambda x: x != ['', ''], the_list))

NB. I named the list "the_list"

output:

[['9743', 'user3'], ['435', 'user2'], ['5426', 'user8']]

If you want to stop at any item being '':

from itertools import takewhile
list(takewhile(lambda x: '' not in x, l))

CodePudding user response:

You can lose a for-loop like this: (with x being your list)

output = []
for pair in x:
    if pair != ['', '']:
        output.append(pair)
    else:
        break   # Breaking as soon as there is an empty pair.

The output is:

[['9743', 'user3'], ['435', 'user2'], ['5426', 'user8']]

CodePudding user response:

Iterate through each item in the list, slice the list when the empty value is found and break.

for i in range(len(lst)):
  if lst[i][0] == "" and lst[i][1] == "":
    lst = lst[:i]
    break

CodePudding user response:

Using iter with sentinel:

list(iter(iter(lst).__next__, ['', '']))
  • Related