Helpex - Trao đổi & giúp đỡ Đăng nhập
19

Tôi được cung cấp một danh sách lvà tôi muốn thực hiện nhiệm vụ:

l[index] = val

Nhưng có thể có một trường hợp khi danh sách quá nhỏ.

Vì vậy, tôi muốn đảm bảo rằng tôi có không gian cho giá trị mới. Đôi khi tôi cần phải lấp đầy không gian mới với chuỗi rỗng '', và đôi khi với các đối tượng khác (như danh sách rỗng [], Falsehoặc None).

Đối với tác vụ này, tôi sử dụng quy trình sau:

def ResizeList(l, size, fill_with=None):
    l += [fill_with]*(size-len(l))

(lưu ý: nó hoạt động ngay cả khi size-len(l)<=0) (lưu ý: vì tôi quan tâm đến việc đặt trước không gian , tôi cố ý KHÔNG cắt ngắn nó thành một danh sách ngắn hơn)

Như vậy:

ResizeList(l, index+1)
l[index] = val

(Khi điền vào đối tượng khác, nó giống như ResizeList(l, index+1, []):)

Có nhiều cách khác để làm điều đó không? Có một số chức năng tích hợp hoặc thư viện để thực hiện việc này không?

Tôi chủ yếu sử dụng Python-3.x, nhưng bí quyết về Python-2x rất hữu ích và được hoan nghênh.

Làm rõ: Xin vui lòng, không cho tôi biết về dict, vì tôi cầnlist

Đối với những người muốn tôi nói cụ thể hơn:

Câu lệnh vấn đề nói rằng đó là về listloại. Sử dụng dictở đây không phải là một lựa chọn hay giải pháp. Có những lý do cho điều đó, đặc biệt liên quan đến miền (tôi đang làm một nguyên mẫu của một thử nghiệm phải cho thấy một số hành vi tiệm cận, không phải - như bạn đã quen - một nguyên mẫu của một chương trình. Nếu nó sẽ là "chỉ một nguyên mẫu của một chương trình ", sau đó tôi đồng ý với việc sử dụng một dict và các nhận xét khác). Tôi có các giả định sau:

  • Tôi có nhiều danh sách (cần quan tâm đến chi phí bộ nhớ và hiệu suất)
  • do quy trình làm việc và nhu cầu về nguyên mẫu, tôi không thể gọi tiện ích mở rộng C / C ++ được mã hóa bằng tay
  • trong quá trình tính toán, kích thước danh sách cuối cùng là không xác định
  • chúng tôi biết rằng trong và danh sách sẽ dày đặc
  • các ô danh sách được ghi và ghi đè theo một thứ tự không xác định

Đó chỉ là một vài lý do tại sao tôi nhấn mạnh rằng tôi cần một listchứ không phải một dict. Đối với những người quan tâm đến thêm chi tiết hoặc những người muốn thảo luận về dict, hãy xem cách chúng tôi thảo luận trong phần bình luận TẠI ĐÂY

19 hữu ích 5 bình luận 18k xem chia sẻ
9

Nếu bạn chắc chắn rằng danh sách - và không, chẳng hạn, a dict- là cấu trúc dữ liệu tốt nhất cho trường hợp sử dụng của bạn, tôi đề xuất lớp sau:

class rlist(list):
  def __init__(self, default):
    self._default = default
  def __setitem__(self, key, value):
    if key >= len(self):
      self += [self._default] * (key - len(self) + 1)
    super(rlist, self).__setitem__(key, value)

l = rlist(0)
print(l)
l[10] = 20
print(l)
l[5] = 14
print(l)

Lớp này kiểm tra xem chỉ mục được gán cho có vượt quá độ dài hiện tại của danh sách hay không và tự động mở rộng danh sách theo yêu cầu.

Mã tương thích với cả Python 2 và 3 (được thử nghiệm với 2.6.5 và 3.1.2).

Lớp này có thể hữu ích nếu cấu trúc dày đặc và bạn cần tìm phần tử theo chỉ mục càng nhanh càng tốt. Nếu cấu trúc thưa thớt, có lẽ bạn nên cân nhắc sử dụng từ điển.

9 hữu ích 5 bình luận chia sẻ
4

Có lẽ điều này làm những gì bạn muốn:

def resize(l, newsize, filling=None):                                                                                  
    if newsize > len(l):                                                                                 
        l.extend([filling for x in xrange(len(l), newsize)])                                                 
    else:                                                                                                
        del l[newsize:]                  
4 hữu ích 3 bình luận chia sẻ
4

Tôi đã nghĩ ra một cái gì đó sử dụng itertool.repeat().

import itertools

def assign(lst, idx, value, fill=None):
    diff = len(lst) - idx
    if diff >= 0:
        lst[idx] = value
    else:
        lst.extend(itertools.repeat(fill, -diff))
        lst.append(value)

Điều đó có hành vi sau:

>>> l = [0, 1, 2, 3, 4]
>>> assign(l, 2, 'new')
>>> l
[0, 1, 'new', 3, 4]
>>> assign(l, 8, 'new')
>>> l
[0, 1, 'new', 3, 4, None, None, None, 'new']
>>> assign(l, 10, 'new', fill=[])
>>> l
[0, 1, 'new', 3, 4, None, None, None, 'new', [], 'new']

công việc này là dành cho bạn?

Chỉnh sửa: Vì câu hỏi đã được cập nhật, tôi đã cập nhật câu trả lời.

4 hữu ích 5 bình luận chia sẻ
2

Thử cái này:

def ResizeList(some_list, length, null_item = None): 
    return some_list + [null_item 
                        for item in range(length - len(lst))]
2 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python python-3.x , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading