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

danh sách zip với một phần tử duy nhất

Lê Ðức Tài
· 22:16 10/04/2016
hôm qua

Tôi có danh sách một số phần tử, ví dụ [1, 2, 3, 4]và một đối tượng duy nhất, ví dụ 'a'. Tôi muốn tạo ra một danh sách các bộ dữ liệu với các phần tử của danh sách ở vị trí đầu tiên và đối tượng duy nhất ở vị trí thứ hai: [(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')].

Tôi có thể làm điều đó với zipnhư thế này:

def zip_with_scalar(l, o): # l - the list; o - the object
    return list(zip(l, [o] * len(l)))

Tuy nhiên, điều này cho tôi cảm giác tạo ra và không cần thiết danh sách các phần tử lặp lại.

Một khả năng khác là

def zip_with_scalar(l, o):
    return [(i, o) for i in l]

thực sự là rất sạch sẽ và có mùi hôi, nhưng ở đây tôi làm toàn bộ mọi thứ "theo cách thủ công". Ở Haskell, tôi sẽ làm một cái gì đó như

zipWithScalar l o = zip l $ repeat o

Có bất kỳ chức năng hoặc thủ thuật tích hợp nào, cho phép nén với vô hướng hoặc cho một cái gì đó có thể cho phép tôi sử dụng zip thông thường, tức là sắp xếp danh sách vô hạn không?

33 hữu ích 5 bình luận 21k xem chia sẻ
Hồ Bích Nhã
· 22:19 10/04/2016
22:19:34 10/04/2016

Đây là bản sao cho giải pháp Haskell của bạn:

import itertools

def zip_with_scalar(l, o):
    return zip(l, itertools.repeat(o))

Bạn cũng có thể sử dụng trình tạo, tránh tạo một danh sách như phần hiểu được thực hiện:

def zip_with_scalar(l, o):
    return ((i, o) for i in l)
47 hữu ích 0 bình luận chia sẻ
Hồ Anh Chi
· 22:29 10/04/2016
22:29:16 10/04/2016

Bạn có thể sử dụng mapchức năng tích hợp sẵn:

>>> elements = [1, 2, 3, 4]
>>> key = 'a'
>>> map(lambda e: (e, key), elements)
[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')]
15 hữu ích 0 bình luận chia sẻ
Huỳnh Mai Châu
· 17:29 07/05/2017
17:29:43 07/05/2017
lst = [1,2,3,4]
tups = [(itm, 'a') for itm in lst]
tups

> [(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')]
5 hữu ích 0 bình luận chia sẻ
Nguyễn Hoàng Việt
· 04:49 11/04/2016
04:49:35 11/04/2016

Đây là một công việc hoàn hảo cho itertools.cyclelớp.

from itertools import cycle


def zip_with_scalar(l, o):
    return zip(i, cycle(o))

Bản giới thiệu:

>>> from itertools import cycle
>>> l = [1, 2, 3, 4]
>>> list(zip(l, cycle('a')))
[(1, 'a'), (2, 'a'), (3, 'a'), (4, 'a')]
4 hữu ích 4 bình luận chia sẻ
Lê Trường Long
· 22:26 10/04/2016
22:26:59 10/04/2016

Bạn cũng có thể sử dụng zip_longest với giá trị lấp đầy là o:

from itertools import zip_longest

def zip_with_scalar(l, o): # l - the list; o - the object
    return zip_longest(l, [o], fillvalue=o)

print(list(zip_with_scalar([1, 2, 3, 4] ,"a")))

Chỉ cần lưu ý rằng mọi giá trị có thể thay đổi được sử dụng cho osẽ không được sao chép dù sử dụng zip_longest hay lặp lại.

3 hữu ích 0 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 list python-3.x , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm