Question

I've got some list of lists and it values can be empty [] or NoneType

lst = [[[]], [1, None], 2, [[], 3], 4]

And I need to randomise them. To get [[1, None], 4, 2, [[], 3], [[]]], for example.

But if I use shuffle(lst) I've got an exception:

TypeError: 'NoneType' object is not iterable

UPD: My mistake was that I try to put the result into variable

newLst = shuffle(lst)

That's give NoneType object.

Was it helpful?

Solution 2

From the comments:

The problem is in misunderstanding of how random.shuffle works. You've tried to iterate through the returned value which is None, because shuffle returns nothing and changes its argument in-place.

Here's how you can solve this problem:

lst = [[[]], [1, None], 2, [[], 3], 4]
shuffle(lst) # Don't capture the return value
# lst is now shuffled and you can put it into `for` loop:
for x in lst:
    # something

OTHER TIPS

You want to make sure you shuffle in place before print or assignment.

>>> from random import shuffle
>>> lst = [[[]], [1, None], 2, [[], 3], 4]
>>> shuffle(lst)
>>> print(lst)
[2, 4, [[], 3], [1, None], [[]]]

Glad you found the answer (that random.shuffle modifies the list in-place and returns None) - however, if you wanted to leave the list unmodified and get a "shuffled" result, then:

import random
shuffled = sorted(lst, key=lambda L: random.random())

Will do that for you.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top