Hướng dẫn how do you shift elements in python? - làm thế nào để bạn thay đổi các phần tử trong python?

Một

def shift(seq, n):
    n = n % len(seq)
    return seq[n:] + seq[:n]
3 được tối ưu hóa để kéo và đẩy vào cả hai đầu. Họ thậm chí có một phương pháp
def shift(seq, n):
    n = n % len(seq)
    return seq[n:] + seq[:n]
4 chuyên dụng.

from collections import deque
items = deque([1, 2])
items.append(3)        # deque == [1, 2, 3]
items.rotate(1)        # The deque is now: [3, 1, 2]
items.rotate(-1)       # Returns deque to original state: [1, 2, 3]
item = items.popleft() # deque == [2, 3]

Hướng dẫn how do you shift elements in python? - làm thế nào để bạn thay đổi các phần tử trong python?

CodeForester

36.1k16 Huy hiệu vàng104 Huy hiệu bạc128 Huy hiệu đồng16 gold badges104 silver badges128 bronze badges

Đã trả lời ngày 27 tháng 1 năm 2010 lúc 20:46Jan 27, 2010 at 20:46

4

Điều gì về việc chỉ sử dụng

def shift(seq, n):
    n = n % len(seq)
    return seq[n:] + seq[:n]
5?

def shift(seq, n):
    n = n % len(seq)
    return seq[n:] + seq[:n]
6

Loại bỏ mục tại vị trí đã cho trong danh sách và trả về nó. Nếu không có chỉ mục được chỉ định,

def shift(seq, n):
    n = n % len(seq)
    return seq[n:] + seq[:n]
7 sẽ xóa và trả về mục cuối cùng trong danh sách. .

tobias_k

79,8K11 Huy hiệu vàng115 Huy hiệu bạc174 Huy hiệu đồng11 gold badges115 silver badges174 bronze badges

Đã trả lời ngày 5 tháng 12 năm 2011 lúc 20:20Dec 5, 2011 at 20:20

JamgoldjamgoldJamgold

1.7061 Huy hiệu vàng14 Huy hiệu bạc18 Huy hiệu đồng1 gold badge14 silver badges18 bronze badges

7

Numpy có thể làm điều này bằng lệnh

def shift(seq, n):
    n = n % len(seq)
    return seq[n:] + seq[:n]
9:

>>> import numpy
>>> a=numpy.arange(1,10) #Generate some data
>>> numpy.roll(a,1)
array([9, 1, 2, 3, 4, 5, 6, 7, 8])
>>> numpy.roll(a,-1)
array([2, 3, 4, 5, 6, 7, 8, 9, 1])
>>> numpy.roll(a,5)
array([5, 6, 7, 8, 9, 1, 2, 3, 4])
>>> numpy.roll(a,9)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

Đã trả lời ngày 13 tháng 10 năm 2012 lúc 10:57Oct 13, 2012 at 10:57

Hướng dẫn how do you shift elements in python? - làm thế nào để bạn thay đổi các phần tử trong python?

RichardrichardRichard

52.2K30 Huy hiệu vàng170 Huy hiệu bạc243 Huy hiệu Đồng30 gold badges170 silver badges243 bronze badges

3

Nó phụ thuộc vào những gì bạn muốn xảy ra khi bạn làm điều này:

>>> shift([1,2,3], 14)

Bạn có thể muốn thay đổi:

def shift(seq, n):
    return seq[n:]+seq[:n]

to:

def shift(seq, n):
    n = n % len(seq)
    return seq[n:] + seq[:n]

Đã trả lời ngày 27 tháng 1 năm 2010 lúc 21:48Jan 27, 2010 at 21:48

Jcdyerjcdyerjcdyer

18.2K5 Huy hiệu vàng41 Huy hiệu bạc48 Huy hiệu đồng5 gold badges41 silver badges48 bronze badges

4

Cách đơn giản nhất tôi có thể nghĩ đến:

a.append(a.pop(0))

Hướng dẫn how do you shift elements in python? - làm thế nào để bạn thay đổi các phần tử trong python?

RUNDOSRUN

9.7155 huy hiệu vàng43 Huy hiệu bạc54 Huy hiệu đồng5 gold badges43 silver badges54 bronze badges

Đã trả lời ngày 8 tháng 7 năm 2014 lúc 12:15Jul 8, 2014 at 12:15

ThijsthijsThijs

3153 Huy hiệu bạc2 Huy hiệu đồng3 silver badges2 bronze badges

2

Chỉ một số ghi chú về thời gian:

Nếu bạn bắt đầu với một danh sách,

a.append(a.pop(0))
0 là phương pháp nhanh nhất bạn có thể sử dụng. Điều này có thể được hiển thị với độ phức tạp thời gian một mình:

  • deque.rotate là o (k) (k = số phần tử)O(k) (k=number of elements)
  • Danh sách chuyển đổi deque là O (n)O(n)
  • list.append và list.pop đều là O (1)O(1)

Vì vậy, nếu bạn đang bắt đầu với các đối tượng

a.append(a.pop(0))
1, bạn có thể
a.append(a.pop(0))
2 với chi phí của O (k). Nhưng, nếu điểm bắt đầu là một danh sách, độ phức tạp về thời gian của việc sử dụng
a.append(a.pop(0))
2 là O (n).
a.append(a.pop(0))
4 nhanh hơn tại O (1).

Chỉ vì lợi ích của hình minh họa, đây là một số thời gian mẫu trên 1m lặp:

Các phương thức yêu cầu chuyển đổi loại:

  • a.append(a.pop(0))
    
    5 với đối tượng deque: 0.12380790710449219 giây (nhanh nhất)0.12380790710449219 seconds (fastest)
  • a.append(a.pop(0))
    
    5 với chuyển đổi loại: 6.853878974914551 giây6.853878974914551 seconds
  • a.append(a.pop(0))
    
    7 với NParray: 6.0491721630096436 giây6.0491721630096436 seconds
  • a.append(a.pop(0))
    
    7 với chuyển đổi loại: 27.558452129364014 giây27.558452129364014 seconds

Liệt kê các phương pháp được đề cập ở đây:

  • a.append(a.pop(0))
    
    0: 0.32483696937561035 giây (nhanh nhất)0.32483696937561035 seconds (fastest)
  • "
    from collections import deque
    import big_o
    
    def create_deque_from_list(l):
         return deque(l)
    
    best, others = big_o.big_o(create_deque_from_list, lambda n: big_o.datagen.integers(n, -100, 100))
    print best
    
    # --> Linear: time = -2.6E-05 + 1.8E-08*n
    
    0": 4.819645881652832 giây4.819645881652832 seconds
  • ...

Mã thời gian được sử dụng dưới đây.


collections.deque

Cho thấy rằng việc tạo Deques từ danh sách là O (N):

from collections import deque
import big_o

def create_deque_from_list(l):
     return deque(l)

best, others = big_o.big_o(create_deque_from_list, lambda n: big_o.datagen.integers(n, -100, 100))
print best

# --> Linear: time = -2.6E-05 + 1.8E-08*n

Nếu bạn cần tạo các đối tượng deque:

1m lặp lại @ 6.853878974914551 giây

setup_deque_rotate_with_create_deque = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
"""

test_deque_rotate_with_create_deque = """
dl = deque(l)
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_with_create_deque, setup_deque_rotate_with_create_deque)

Nếu bạn đã có các đối tượng deque:

1m lặp lại @ 0.12380790710449219 giây

setup_deque_rotate_alone = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
dl = deque(l)
"""

test_deque_rotate_alone= """
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_alone, setup_deque_rotate_alone)

np.roll

Nếu bạn cần tạo nparrays

Các lần lặp 1m @ 27.558452129364014 giây

setup_np_roll_with_create_npa = """
import numpy as np
import random
l = [random.random() for i in range(1000)]
"""

test_np_roll_with_create_npa = """
np.roll(l,-1) # implicit conversion of l to np.nparray
"""

Nếu bạn đã có nparrays:

1m lặp lại @ 6.0491721630096436 giây

>>> import numpy
>>> a=numpy.arange(1,10) #Generate some data
>>> numpy.roll(a,1)
array([9, 1, 2, 3, 4, 5, 6, 7, 8])
>>> numpy.roll(a,-1)
array([2, 3, 4, 5, 6, 7, 8, 9, 1])
>>> numpy.roll(a,5)
array([5, 6, 7, 8, 9, 1, 2, 3, 4])
>>> numpy.roll(a,9)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
0

"Thay đổi vị trí"

Không yêu cầu chuyển đổi loại

Các lần lặp 1m @ 4.819645881652832 giây

>>> import numpy
>>> a=numpy.arange(1,10) #Generate some data
>>> numpy.roll(a,1)
array([9, 1, 2, 3, 4, 5, 6, 7, 8])
>>> numpy.roll(a,-1)
array([2, 3, 4, 5, 6, 7, 8, 9, 1])
>>> numpy.roll(a,5)
array([5, 6, 7, 8, 9, 1, 2, 3, 4])
>>> numpy.roll(a,9)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
1

l.append(l.pop(0))

Không yêu cầu chuyển đổi loại

Các lần lặp 1m @ 4.819645881652832 giây

>>> import numpy
>>> a=numpy.arange(1,10) #Generate some data
>>> numpy.roll(a,1)
array([9, 1, 2, 3, 4, 5, 6, 7, 8])
>>> numpy.roll(a,-1)
array([2, 3, 4, 5, 6, 7, 8, 9, 1])
>>> numpy.roll(a,5)
array([5, 6, 7, 8, 9, 1, 2, 3, 4])
>>> numpy.roll(a,9)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
2

1m lặp lại @ 0.32483696937561035Jul 4, 2017 at 9:12

Đã trả lời ngày 4 tháng 7 năm 2017 lúc 9:12Purrell

Purrellpurrell16 gold badges55 silver badges70 bronze badges

4

12.1k16 Huy hiệu vàng55 Huy hiệu bạc70 Huy hiệu đồng

Tôi cũng đã quan tâm đến điều này và so sánh một số giải pháp được đề xuất với perfplot (một dự án nhỏ của tôi).

>>> import numpy
>>> a=numpy.arange(1,10) #Generate some data
>>> numpy.roll(a,1)
array([9, 1, 2, 3, 4, 5, 6, 7, 8])
>>> numpy.roll(a,-1)
array([2, 3, 4, 5, 6, 7, 8, 9, 1])
>>> numpy.roll(a,5)
array([5, 6, 7, 8, 9, 1, 2, 3, 4])
>>> numpy.roll(a,9)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
3

Hóa ra là gợi ý của Kelly Bundy

Thực hiện rất tốt cho tất cả các ca.

from collections import deque
import big_o

def create_deque_from_list(l):
     return deque(l)

best, others = big_o.big_o(create_deque_from_list, lambda n: big_o.datagen.integers(n, -100, 100))
print best

# --> Linear: time = -2.6E-05 + 1.8E-08*n
1:

Hướng dẫn how do you shift elements in python? - làm thế nào để bạn thay đổi các phần tử trong python?

from collections import deque
import big_o

def create_deque_from_list(l):
     return deque(l)

best, others = big_o.big_o(create_deque_from_list, lambda n: big_o.datagen.integers(n, -100, 100))
print best

# --> Linear: time = -2.6E-05 + 1.8E-08*n
2:

Hướng dẫn how do you shift elements in python? - làm thế nào để bạn thay đổi các phần tử trong python?


Về cơ bản, perfplot thực hiện sự thay đổi để tăng các mảng lớn và đo thời gian. Đây là kết quả:

>>> import numpy
>>> a=numpy.arange(1,10) #Generate some data
>>> numpy.roll(a,1)
array([9, 1, 2, 3, 4, 5, 6, 7, 8])
>>> numpy.roll(a,-1)
array([2, 3, 4, 5, 6, 7, 8, 9, 1])
>>> numpy.roll(a,5)
array([5, 6, 7, 8, 9, 1, 2, 3, 4])
>>> numpy.roll(a,9)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
4

Mã để tái tạo lô:Jul 20, 2018 at 15:04

Đã trả lời ngày 20 tháng 7 năm 2018 lúc 15:04Nico Schlömer

Nico Schlömernico Schlömer25 gold badges186 silver badges227 bronze badges

6

49.2K25 Huy hiệu vàng186 Huy hiệu bạc227 Huy hiệu đồng

>>> import numpy
>>> a=numpy.arange(1,10) #Generate some data
>>> numpy.roll(a,1)
array([9, 1, 2, 3, 4, 5, 6, 7, 8])
>>> numpy.roll(a,-1)
array([2, 3, 4, 5, 6, 7, 8, 9, 1])
>>> numpy.roll(a,5)
array([5, 6, 7, 8, 9, 1, 2, 3, 4])
>>> numpy.roll(a,9)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
5

Nếu bạn chỉ muốn lặp lại các tập hợp các phần tử này thay vì xây dựng một cấu trúc dữ liệu riêng biệt, hãy xem xét sử dụng trình lặp để xây dựng biểu thức máy phát:Oct 29, 2012 at 15:34

Đã trả lời ngày 29 tháng 10 năm 2012 lúc 15:34Phil H

Phil HPhil h7 gold badges64 silver badges103 bronze badges

Huy hiệu vàng 19,5K7

>>> import numpy
>>> a=numpy.arange(1,10) #Generate some data
>>> numpy.roll(a,1)
array([9, 1, 2, 3, 4, 5, 6, 7, 8])
>>> numpy.roll(a,-1)
array([2, 3, 4, 5, 6, 7, 8, 9, 1])
>>> numpy.roll(a,5)
array([5, 6, 7, 8, 9, 1, 2, 3, 4])
>>> numpy.roll(a,9)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
6

Điều này cũng phụ thuộc vào việc bạn muốn thay đổi danh sách tại chỗ (đột biến nó) hoặc nếu bạn muốn chức năng trả về một danh sách mới. Bởi vì, theo các bài kiểm tra của tôi, một cái gì đó như thế này nhanh hơn ít nhất hai mươi lần so với việc triển khai của bạn có thêm hai danh sách:

Trên thực tế, ngay cả việc thêm

from collections import deque
import big_o

def create_deque_from_list(l):
     return deque(l)

best, others = big_o.big_o(create_deque_from_list, lambda n: big_o.datagen.integers(n, -100, 100))
print best

# --> Linear: time = -2.6E-05 + 1.8E-08*n
3 vào đầu đó để hoạt động trên một bản sao của danh sách được truyền lại vẫn còn nhanh gấp đôi.

Các triển khai khác nhau với một số thời gian tại http://gist.github.com/288272Jan 27, 2010 at 23:10

Đã trả lời ngày 27 tháng 1 năm 2010 lúc 23:10keturn

Keturnketurn3 gold badges28 silver badges40 bronze badges

3

4.7603 Huy hiệu vàng28 Huy hiệu bạc40 Huy hiệu đồng

>>> import numpy
>>> a=numpy.arange(1,10) #Generate some data
>>> numpy.roll(a,1)
array([9, 1, 2, 3, 4, 5, 6, 7, 8])
>>> numpy.roll(a,-1)
array([2, 3, 4, 5, 6, 7, 8, 9, 1])
>>> numpy.roll(a,5)
array([5, 6, 7, 8, 9, 1, 2, 3, 4])
>>> numpy.roll(a,9)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
7

Đối với một triển khai bất biến, bạn có thể sử dụng một cái gì đó như thế này:

dabuno3 silver badges4 bronze badges

3433 Huy hiệu bạc4 Huy hiệu đồngFeb 25, 2012 at 21:49

Đã trả lời ngày 25 tháng 2 năm 2012 lúc 21:49Bittercoder

BittercoderBitterCoder9 gold badges57 silver badges76 bronze badges

Có thể một bộ ringbuffer phù hợp hơn. Nó không phải là một danh sách, mặc dù có khả năng nó có thể hoạt động đủ như một danh sách cho mục đích của bạn.

Vấn đề là hiệu quả của sự thay đổi trong danh sách là O (N), trở nên quan trọng đối với các danh sách đủ lớn.

Việc chuyển số vòng tròn chỉ đơn giản là cập nhật vị trí đầu là O (1)

Đã trả lời ngày 27 tháng 1 năm 2010 lúc 21:59Jan 27, 2010 at 21:59

Hướng dẫn how do you shift elements in python? - làm thế nào để bạn thay đổi các phần tử trong python?

John La Rooyjohn La RooyJohn La Rooy

Phù bằng vàng 287K5151 gold badges359 silver badges500 bronze badges

Nếu hiệu quả là mục tiêu của bạn, (chu kỳ? Bộ nhớ?) Bạn có thể tốt hơn khi nhìn vào mô -đun mảng: http://docs.python.org/l Library/array.html

Mảng không có chi phí của danh sách.

Theo như danh sách thuần túy đi mặc dù, những gì bạn có là tốt như bạn có thể hy vọng làm.

Đã trả lời ngày 27 tháng 1 năm 2010 lúc 20:47Jan 27, 2010 at 20:47

đệ quyrecursive

82.2K32 Huy hiệu vàng148 Huy hiệu bạc237 Huy hiệu đồng32 gold badges148 silver badges237 bronze badges

0

Tôi nghĩ rằng bạn đang tìm kiếm điều này:

>>> import numpy
>>> a=numpy.arange(1,10) #Generate some data
>>> numpy.roll(a,1)
array([9, 1, 2, 3, 4, 5, 6, 7, 8])
>>> numpy.roll(a,-1)
array([2, 3, 4, 5, 6, 7, 8, 9, 1])
>>> numpy.roll(a,5)
array([5, 6, 7, 8, 9, 1, 2, 3, 4])
>>> numpy.roll(a,9)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
8

Đã trả lời ngày 25 tháng 3 năm 2014 lúc 9:46Mar 25, 2014 at 9:46

1

Một giải pháp khác:

>>> import numpy
>>> a=numpy.arange(1,10) #Generate some data
>>> numpy.roll(a,1)
array([9, 1, 2, 3, 4, 5, 6, 7, 8])
>>> numpy.roll(a,-1)
array([2, 3, 4, 5, 6, 7, 8, 9, 1])
>>> numpy.roll(a,5)
array([5, 6, 7, 8, 9, 1, 2, 3, 4])
>>> numpy.roll(a,9)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
9

Đã trả lời ngày 9 tháng 4 năm 2016 lúc 17:05Apr 9, 2016 at 17:05

Damiodamiodamio

5,8913 Huy hiệu vàng35 Huy hiệu bạc55 Huy hiệu Đồng3 gold badges35 silver badges55 bronze badges

>>> shift([1,2,3], 14)
0

Ví dụ, được đưa ra

>>> shift([1,2,3], 14)
1

Hàm sẽ trả về

from collections import deque
import big_o

def create_deque_from_list(l):
     return deque(l)

best, others = big_o.big_o(create_deque_from_list, lambda n: big_o.datagen.integers(n, -100, 100))
print best

# --> Linear: time = -2.6E-05 + 1.8E-08*n
4. Ba vòng quay đã được thực hiện:

>>> shift([1,2,3], 14)
2

Ví dụ khác, được đưa ra

>>> shift([1,2,3], 14)
3

chức năng sẽ trả về

from collections import deque
import big_o

def create_deque_from_list(l):
     return deque(l)

best, others = big_o.big_o(create_deque_from_list, lambda n: big_o.datagen.integers(n, -100, 100))
print best

# --> Linear: time = -2.6E-05 + 1.8E-08*n
5

Được

>>> shift([1,2,3], 14)
4

chức năng sẽ trả về

from collections import deque
import big_o

def create_deque_from_list(l):
     return deque(l)

best, others = big_o.big_o(create_deque_from_list, lambda n: big_o.datagen.integers(n, -100, 100))
print best

# --> Linear: time = -2.6E-05 + 1.8E-08*n
6

Robc

21.1K20 Huy hiệu vàng66 Huy hiệu bạc74 Huy hiệu đồng20 gold badges66 silver badges74 bronze badges

Đã trả lời ngày 15 tháng 11 năm 2019 lúc 8:41Nov 15, 2019 at 8:41

Tôi lấy mô hình chi phí này làm tài liệu tham khảo:

http://scripts.mit.edu/~6.006/fall07/wiki/index.php?title=Python_Cost_Model

Phương pháp cắt danh sách của bạn và kết hợp hai danh sách phụ là các hoạt động thời gian tuyến tính. Tôi sẽ đề nghị sử dụng POP, đó là một hoạt động thời gian không đổi, ví dụ:

>>> shift([1,2,3], 14)
5

Shanethehat

15.4K11 Huy hiệu vàng56 Huy hiệu bạc87 Huy hiệu đồng11 gold badges56 silver badges87 bronze badges

Đã trả lời ngày 21 tháng 2 năm 2012 lúc 22:32Feb 21, 2012 at 22:32

Herrfzherrfzherrfz

4.7483 Huy hiệu vàng25 Huy hiệu bạc37 Huy hiệu đồng3 gold badges25 silver badges37 bronze badges

2

Tôi không biết nếu đây là 'hiệu quả', nhưng nó cũng hoạt động:

>>> shift([1,2,3], 14)
6

Chỉnh sửa: Xin chào một lần nữa, tôi chỉ tìm thấy một vấn đề lớn với giải pháp này! Xem xét mã sau:

>>> shift([1,2,3], 14)
7

Phương thức Shift_ClassList () thực thi cùng mã với x.insert của tôi (0, x.pop ())-Giải pháp, Danh sách khác là một danh sách phụ thuộc từ lớp. Sau khi chuyển nội dung của Danh sách khác cho danh sách MyClass.ClassList, gọi Shift_ClassList () cũng thay đổi danh sách khác:

Đầu ra bảng điều khiển:

>>> shift([1,2,3], 14)
8

Tôi sử dụng Python 2.7. Tôi không biết đó có phải là một lỗi không, nhưng tôi nghĩ nhiều khả năng tôi đã hiểu được điều gì đó ở đây.

Có ai trong số các bạn biết tại sao điều này xảy ra không?

Đã trả lời ngày 17 tháng 5 năm 2013 lúc 16:57May 17, 2013 at 16:57

wese3112wese3112wese3112

Huy hiệu vàng 9311 gold badge1 silver badge6 bronze badges

2

Phương pháp sau là O (n) tại chỗ với bộ nhớ phụ không đổi:

>>> shift([1,2,3], 14)
9

Lưu ý rằng trong Python, cách tiếp cận này không hiệu quả khủng khiếp so với những người khác vì nó không thể tận dụng việc triển khai bản địa của bất kỳ phần nào.

Đã trả lời ngày 11 tháng 6 năm 2015 lúc 12:19Jun 11, 2015 at 12:19

DrayxdrayxDRayX

1.0232 huy hiệu vàng12 Huy hiệu bạc19 Huy hiệu đồng2 gold badges12 silver badges19 bronze badges

2

Tôi có điều tương tự. Ví dụ, để thay đổi theo hai ...

def shift(seq, n):
    return seq[n:]+seq[:n]
0

Đã trả lời ngày 13 tháng 1 năm 2016 lúc 18:19Jan 13, 2016 at 18:19

Hướng dẫn how do you shift elements in python? - làm thế nào để bạn thay đổi các phần tử trong python?

Eyoeldefareeeyoeldefareeyoeldefare

1.9671 Huy hiệu vàng14 Huy hiệu bạc25 Huy hiệu đồng1 gold badge14 silver badges25 bronze badges

Tôi nghĩ rằng bạn đã có cách hiệu quả nhất

def shift(seq, n):
    return seq[n:]+seq[:n]
1

Đã trả lời ngày 23 tháng 8 năm 2017 lúc 21:17Aug 23, 2017 at 21:17

Hướng dẫn how do you shift elements in python? - làm thế nào để bạn thay đổi các phần tử trong python?

John Ktejikjohn Ktejikjohn ktejik

5.7514 Huy hiệu vàng49 Huy hiệu bạc53 Huy hiệu Đồng4 gold badges49 silver badges53 bronze badges

Jon Bentley trong Lập trình Pearls (cột 2) mô tả một thuật toán thanh lịch và hiệu quả để xoay một vectơ ____ ____ 67 phần tử

from collections import deque
import big_o

def create_deque_from_list(l):
     return deque(l)

best, others = big_o.big_o(create_deque_from_list, lambda n: big_o.datagen.integers(n, -100, 100))
print best

# --> Linear: time = -2.6E-05 + 1.8E-08*n
8 để lại các vị trí
def shift(seq, n):
    n = n % len(seq)
    return seq[n:] + seq[:n]
8:

Chúng ta hãy xem vấn đề là chuyển đổi mảng

setup_deque_rotate_with_create_deque = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
"""

test_deque_rotate_with_create_deque = """
dl = deque(l)
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_with_create_deque, setup_deque_rotate_with_create_deque)
0 thành mảng
setup_deque_rotate_with_create_deque = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
"""

test_deque_rotate_with_create_deque = """
dl = deque(l)
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_with_create_deque, setup_deque_rotate_with_create_deque)
1, nhưng chúng ta cũng cho rằng chúng ta có một hàm đảo ngược các phần tử trong một phần được chỉ định của mảng. Bắt đầu với
setup_deque_rotate_with_create_deque = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
"""

test_deque_rotate_with_create_deque = """
dl = deque(l)
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_with_create_deque, setup_deque_rotate_with_create_deque)
0, chúng tôi đảo ngược
setup_deque_rotate_with_create_deque = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
"""

test_deque_rotate_with_create_deque = """
dl = deque(l)
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_with_create_deque, setup_deque_rotate_with_create_deque)
3 để có được
setup_deque_rotate_with_create_deque = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
"""

test_deque_rotate_with_create_deque = """
dl = deque(l)
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_with_create_deque, setup_deque_rotate_with_create_deque)
4, đảo ngược
setup_deque_rotate_with_create_deque = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
"""

test_deque_rotate_with_create_deque = """
dl = deque(l)
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_with_create_deque, setup_deque_rotate_with_create_deque)
5 để có được
setup_deque_rotate_with_create_deque = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
"""

test_deque_rotate_with_create_deque = """
dl = deque(l)
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_with_create_deque, setup_deque_rotate_with_create_deque)
6, và sau đó đảo ngược toàn bộ sự việc để có được
setup_deque_rotate_with_create_deque = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
"""

test_deque_rotate_with_create_deque = """
dl = deque(l)
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_with_create_deque, setup_deque_rotate_with_create_deque)
7, chính xác là
setup_deque_rotate_with_create_deque = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
"""

test_deque_rotate_with_create_deque = """
dl = deque(l)
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_with_create_deque, setup_deque_rotate_with_create_deque)
1. Điều này dẫn đến mã sau để xoay:

def shift(seq, n):
    return seq[n:]+seq[:n]
2

Điều này có thể được dịch sang Python như sau:

def shift(seq, n):
    return seq[n:]+seq[:n]
3

Demo:

def shift(seq, n):
    return seq[n:]+seq[:n]
4

Đã trả lời ngày 1 tháng 7 năm 2018 lúc 16:47Jul 1, 2018 at 16:47

Eugene Yarmasheugene YarmashEugene Yarmash

136K38 Huy hiệu vàng312 Huy hiệu bạc368 Huy hiệu đồng38 gold badges312 silver badges368 bronze badges

Tôi đã tìm kiếm giải pháp tại chỗ cho vấn đề này. Điều này giải quyết mục đích trong O (k).

def shift(seq, n):
    return seq[n:]+seq[:n]
5

Đã trả lời ngày 25 tháng 12 năm 2019 lúc 16:14Dec 25, 2019 at 16:14

AnkitankitAnkit

474 Huy hiệu Đồng4 bronze badges

Trường hợp sử dụng là gì? Thông thường, chúng ta thực sự không cần một mảng được thay đổi hoàn toàn -chúng ta chỉ cần truy cập vào một số ít các phần tử trong mảng đã thay đổi.

Nhận được các lát python là thời gian chạy O (k) trong đó k là lát cắt, do đó, một vòng quay cắt lát là thời gian chạy N. lệnh xoay deque cũng là o (k). Chúng ta có thể làm tốt hơn không?

Hãy xem xét một mảng cực kỳ lớn (giả sử, nó lớn sẽ được tính toán chậm một cách chậm chạp). Một giải pháp thay thế sẽ là để lại mảng ban đầu một mình và chỉ cần tính toán chỉ số của vật phẩm sẽ tồn tại trong chỉ số mong muốn của chúng tôi sau khi thay đổi một số loại.

Truy cập một phần tử thay đổi do đó trở thành O (1).

def shift(seq, n):
    return seq[n:]+seq[:n]
6

Đã trả lời ngày 31 tháng 10 năm 2017 lúc 23:53Oct 31, 2017 at 23:53

Các bản sao chức năng sau được gửi danh sách cho một Templist, do đó chức năng POP không ảnh hưởng đến danh sách ban đầu:

def shift(seq, n):
    return seq[n:]+seq[:n]
7

Kiểm tra:

def shift(seq, n):
    return seq[n:]+seq[:n]
8

Output:

def shift(seq, n):
    return seq[n:]+seq[:n]
9

Đã trả lời ngày 14 tháng 12 năm 2017 lúc 15:21Dec 14, 2017 at 15:21

rnsornsornso

22.7K22 Huy hiệu vàng103 Huy hiệu bạc213 Huy hiệu Đồng22 gold badges103 silver badges213 bronze badges

Đối với danh sách

setup_deque_rotate_with_create_deque = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
"""

test_deque_rotate_with_create_deque = """
dl = deque(l)
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_with_create_deque, setup_deque_rotate_with_create_deque)
9 và giá trị thay đổi mong muốn
setup_deque_rotate_alone = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
dl = deque(l)
"""

test_deque_rotate_alone= """
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_alone, setup_deque_rotate_alone)
0 nhỏ hơn độ dài danh sách, chúng ta có thể xác định hàm
setup_deque_rotate_alone = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
dl = deque(l)
"""

test_deque_rotate_alone= """
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_alone, setup_deque_rotate_alone)
1 như dưới đâyless than list length, we can define the function
setup_deque_rotate_alone = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
dl = deque(l)
"""

test_deque_rotate_alone= """
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_alone, setup_deque_rotate_alone)
1 as below

def shift(seq, n):
    n = n % len(seq)
    return seq[n:] + seq[:n]
0

Ví dụ,

setup_deque_rotate_alone = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
dl = deque(l)
"""

test_deque_rotate_alone= """
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_alone, setup_deque_rotate_alone)
2 Trả về
setup_deque_rotate_alone = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
dl = deque(l)
"""

test_deque_rotate_alone= """
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_alone, setup_deque_rotate_alone)
3
setup_deque_rotate_alone = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
dl = deque(l)
"""

test_deque_rotate_alone= """
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_alone, setup_deque_rotate_alone)
4 Trả về
setup_deque_rotate_alone = """
from collections import deque
import random
l = [random.random() for i in range(1000)]
dl = deque(l)
"""

test_deque_rotate_alone= """
dl.rotate(-1)
"""
timeit.timeit(test_deque_rotate_alone, setup_deque_rotate_alone)
5

Đã trả lời ngày 2 tháng 8 năm 2018 lúc 4:48Aug 2, 2018 at 4:48

Helcodehelcodehelcode

1.7301 Huy hiệu vàng13 Huy hiệu bạc29 Huy hiệu đồng1 gold badge13 silver badges29 bronze badges

2

Tôi là "trường học cũ" Tôi xác định hiệu quả trong độ trễ thấp nhất, thời gian xử lý và sử dụng bộ nhớ, kẻ thù của chúng tôi là các thư viện cồng kềnh. Vì vậy, có chính xác một cách đúng:

def shift(seq, n):
    n = n % len(seq)
    return seq[n:] + seq[:n]
1

Đã trả lời ngày 26 tháng 12 năm 2020 lúc 0:35Dec 26, 2020 at 0:35

Hướng dẫn how do you shift elements in python? - làm thế nào để bạn thay đổi các phần tử trong python?

Dưới đây là một thuật toán hiệu quả không yêu cầu sử dụng bất kỳ cấu trúc dữ liệu bổ sung nào:

def rotate (nums: list [int], k: int):

def shift(seq, n):
    n = n % len(seq)
    return seq[n:] + seq[:n]
2

Đã trả lời ngày 3 tháng 1 lúc 14:01Jan 3 at 14:01

Làm thế nào để bạn thay đổi một giá trị trong Python?

Để chuyển các giá trị trong một danh sách (thay thế giá trị ở vị trí đầu tiên của danh sách sang vị trí cuối cùng của nó và ngược lại), bạn cần sắp xếp lại danh sách bằng hai lát. Nếu một sự thay đổi theo chu kỳ là cần thiết, hãy lặp lại lệnh này số lần cần thiết trong chu kỳ cho chu kỳ.rearrange the list with two slices. If a cyclic shift is necessary, repeat this command the required number of times in “for” cycle.

Làm thế nào để bạn thay đổi các yếu tố trong một danh sách?

Làm thế nào để bạn thay đổi các yếu tố trong một danh sách ?..
A_List = Bộ sưu tập.Deque ([1, 2, 3, 4, 5]).
một danh sách.xoay (2) dịch chuyển `a_list` 2 vị trí sang phải ..
shifted_list = list (a_list).
print(shifted_list).

Làm thế nào để bạn thay đổi các yếu tố trong một ma trận trong Python?

Để chuyển các phần của các phần tử mảng của mảng 2D sang trái, hãy sử dụng phương thức numpy.left_shift () trong Python Numpy.Các bit được dịch chuyển sang trái bằng cách nối thêm X2 0S ở bên phải của X1.use the numpy. left_shift() method in Python Numpy. Bits are shifted to the left by appending x2 0s at the right of x1.

Làm thế nào để bạn chuyển một vị trí trong danh sách Python?

Phương pháp số 2: Sử dụng chèn () + pop () Chức năng này cũng có thể đạt được bằng cách sử dụng các hàm sẵn của Python viz.Chèn () và pop ().Hàm pop trả về phần tử cuối cùng và được chèn ở phía trước bằng hàm chèn.Using insert() + pop() This functionality can also be achieved using the inbuilt functions of python viz. insert() and pop() . The pop function returns the last element and that is inserted at front using the insert function.