I have the following code:
items = ["one", "two", "three"]
for i in range(0, len(items)):
for index, element in enumerate(items):
if index != i:
# do something with element
Basically I want to exclude every element once and iterate the rest. So for the list I have above, I'd like the following iterations:
The code I've written now seems a little C++-ish, is there a better solution? (I do not want to hold all possible lists in a variable)
EDIT: I didn't state this but the lists size isn't necessarily 3. It can be of any size.
EDIT 2: It seems there's another misunderstanding: if I have a list of N, then I want N lists of size N-1, each missing an element from the original list.
EDIT 3: A list with 4 items, should give this result:
Although upvoted like crazy, my first solution wasn't what the OP wanted, which is N lists, each missing exactly one of the N original elements:
>>> from itertools import combinations
>>> L = ["one", "two", "three", "four"]
>>> for R in combinations(L, len(L) - 1):
... print " and ".join(R)
...
one and two and three
one and two and four
one and three and four
two and three and four
See the revision history for the source of the discussion below.
[items[:i]+items[i+1:] for i in range(len(items))]
in py2.x use xrange
. obviously, slicing all the time on a big sequence is not very efficient, but it's fine for short ones. Better option would be using itertools.combinations
:
>>> for a in itertools.combinations(items, len(items)-1):
print(a)
('one', 'two')
('one', 'three')
('two', 'three')
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With