kettlepot
kettlepot

Reputation: 11011

Move an item inside a list?

In Python, how do I move an item to a definite index in a list?

Upvotes: 152

Views: 224818

Answers (9)

Andy Richter
Andy Richter

Reputation: 189

A recursive bubble sort. It moves one element several times until the list is sorted.

arr[n-1:n-1] = [arr.pop(arr[:n].index(max(arr[:n])))]

Is how I moved one element to the end of the current slice.

Where n starts as the length of arr[]:

def cursed_bubble(arr,n,reverse=False): 
    if n <= 1: 
        if reverse: 
            arr.reverse()
        return 
    # Move one element. Largest to the top of this slice
    arr[n-1:n-1] = [arr.pop(arr[:n].index(max(arr[:n])))]
    return cursed_bubble(arr,n-1,reverse) # smaller slice

Upvotes: -1

V.Petretto
V.Petretto

Reputation: 319

A solution very simple, but you have to know the index of the original position and the index of the new position:

list1[index1], list1[index2] = list1[index2], list1[index1]

Upvotes: 5

Tunahan Bilgi&#231;
Tunahan Bilgi&#231;

Reputation: 1

A forwards(left to right) swapping example:

>>> abc = [1,2,3,4,5]
>>> abc.insert(0, abc.pop(len(abc)-1))

[5, 1, 2, 3, 4]

Upvotes: 0

U13-Forward
U13-Forward

Reputation: 71570

I'd prefer to do it in one expression like this:

>>> l = [1,2,3,4,5]
>>> [*l, l.pop(0)]
[2, 3, 4, 5, 1]

Upvotes: 1

Pranav Kumar
Pranav Kumar

Reputation: 354

l = list(...) #replace ... with the list contents
if item in l: #Checks if the item to be moved is present in the list
    l.remove(item) #  Removes the item from the current list if the previous line's conditions are achieved
l.insert(new_index,item) # Adds item to new list

Upvotes: 0

nngeek
nngeek

Reputation: 1377

If you don't know the position of the item, you may need to find the index first:

old_index = list1.index(item)

then move it:

list1.insert(new_index, list1.pop(old_index))

or IMHO a cleaner way:

list1.remove(item)
list1.insert(new_index, item)

Upvotes: 47

Riedler
Riedler

Reputation: 371

I profiled a few methods to move an item within the same list with timeit. Here are the ones to use if j>i:

┌──────────┬──────────────────────┐
│ 14.4usec │ x[i:i]=x.pop(j),     │
│ 14.5usec │ x[i:i]=[x.pop(j)]    │
│ 15.2usec │ x.insert(i,x.pop(j)) │
└──────────┴──────────────────────┘

and here the ones to use if j<=i:

┌──────────┬───────────────────────────┐
│ 14.4usec │ x[i:i]=x[j],;del x[j]     │
│ 14.4usec │ x[i:i]=[x[j]];del x[j]    │
│ 15.4usec │ x.insert(i,x[j]);del x[j] │
└──────────┴───────────────────────────┘

Not a huge difference if you only use it a few times, but if you do heavy stuff like manual sorting, it's important to take the fastest one. Otherwise, I'd recommend just taking the one that you think is most readable.

Upvotes: 1

Tim
Tim

Reputation: 2592

A slightly shorter solution, that only moves the item to the end, not anywhere is this:

l += [l.pop(0)]

For example:

>>> l = [1,2,3,4,5]
>>> l += [l.pop(0)]
>>> l
[2, 3, 4, 5, 1]

Upvotes: 44

David Z
David Z

Reputation: 131550

Use the insert method of a list:

l = list(...)
l.insert(index, item)

Alternatively, you can use a slice notation:

l[index:index] = [item]

If you want to move an item that's already in the list to the specified position, you would have to delete it and insert it at the new position:

l.insert(newindex, l.pop(oldindex))

Upvotes: 220

Related Questions