有没有办法用一种特定的方式来排列这个列表?

2024-09-28 01:27:11 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有这个清单:

[7, 31, 31, 61, 61, 79, 29, 79, 29, 103, 37, 103, 37, 47, 47, 53, 53, 89, 5, 89, 5, 13, 13, 83, 83, 101, 53, 101, 17, 53, 11, 17, 11, 59, 17, 59, 17, 41, 41, 79, 79, 97, 3, 97, 3, 41, 19, 41, 19, 53, 53, 67, 29, 67, 29, 73, 23, 73, 23, 43, 43, 71]

我想知道是否有一种方法可以对它们进行排序,比如一对的最后一个元素是第二对的第一个元素,就像这样:

[7, 31, 31, 61, 61, 79, 79, 29, 29, 103, 103, 37 ....]
[pair1] [pair2] [pair3] [pair4] [pair5]  [pair6] ...

有办法吗?你知道吗

我尝试过循环,但它只是有一个非常高的时间复杂度。你知道吗

这是我的密码:


lis=[7, 31, 31, 61, 61, 79, 29, 79, 29, 103, 37, 103, 37, 47, 47, 53, 53, 89, 5, 89, 5, 13, 13, 83, 83, 101, 53, 101, 17, 53, 11, 17, 11, 59, 17, 59, 17, 41, 41, 79, 79, 97, 3, 97, 3, 41, 19, 41, 19, 53, 53, 67, 29, 67, 29, 73, 23, 73, 23, 43, 43, 71]
for i in range(0, len(lis)-4,4):
    if lis[i]==lis[i+2]:
        p=lis[i]
        lis[i]=lis[i+1]
        lis[i+1]=p
    elif lis[i]==lis[i+3]:
        p = lis[i]
        lis[i] = lis[i + 1]
        lis[i + 1] = p
        p=lis[i+2]
        lis[i+2]=lis[i+3]
        lis[i+3]=p
    elif lis[i+1]==lis[i+3]:
        p=lis[i+2]
        lis[i+2]=lis[i+3]
        lis[i+3]=p
print(lis)

Tags: 方法元素密码排序时间复杂度elif办法
3条回答

您可以这样做,比如基于原始list中的indexsort

>>> x
[7, 31, 31, 61, 61, 79, 29, 79, 29, 103, 37, 103, 37, 47, 47, 53, 53, 89, 5, 89, 5, 13, 13, 83, 83, 101, 53, 101, 17, 53, 11, 17, 11, 59, 17, 59, 17, 41, 41, 79, 79, 97, 3, 97, 3, 41, 19, 41, 19, 53, 53, 67, 29, 67, 29, 73, 23, 73, 23, 43, 43, 71]

# the `sorted` function takes a `key` function, that one can use to manipulate how the sort should be based on
# In this case, you could use `index` of the `element` in the `list` `x`,
# So, while the sort goes through each element, it check against the index in the original list, which is `x, thus it aligns each item based on the `index`.
>>> sorted(x, key=x.index) # note that you have more than a pair, so :)
[7, 31, 31, 61, 61, 79, 79, 79, 79, 29, 29, 29, 29, 103, 103, 37, 37, 47, 47, 53, 53, 53, 53, 53, 53, 89, 89, 5, 5, 13, 13, 83, 83, 101, 101, 17, 17, 17, 17, 11, 11, 59, 59, 41, 41, 41, 41, 97, 97, 3, 3, 19, 19, 67, 67, 73, 73, 23, 23, 43, 43, 71]

如果你真的喜欢pair,那么

>>> data = []
>>> for k in sorted(x, key=x.index): # `using direct x.index instead of useless lambda(i previously used) in this case, as @Austin suggested
...   if data.count(k) < 2: # add the element until it reaches count 2, which is `pair`, which is what you asked for
...     data.append(k)
... 
>>> data
[7, 31, 31, 61, 61, 79, 79, 29, 29, 103, 103, 37, 37, 47, 47, 53, 53, 89, 89, 5, 5, 13, 13, 83, 83, 101, 101, 17, 17, 11, 11, 59, 59, 41, 41, 97, 97, 3, 3, 19, 19, 67, 67, 73, 73, 23, 23, 43, 43, 71]

推理:

list.index will return the first matching index. Say you have a list, x = [1,2,1,3] and x.index(1) will always return0. Thus it will be sorted differently if one use list.index as the keyfunc for sorting

如果第一个元素和第三个元素相等的话,听起来你想把第二个元素和第三个元素换位。你可以这样做:

i = 0
while i < len(seq) - 2:
    if seq[i] == seq[i + 2]:
        # Swap the next two elements
        seq[i + 1], seq[i + 2] = seq[i + 2], seq[i + 1]
        i = i + 3
        continue
    i = i + 1

这是一个相当草率的解决方案,但它应该做你的工作。你知道吗

首先,我们将数据分成两对,然后对这两对进行排序。你知道吗

data = [7, 31, 31, 61, 61, 79, 29, 79, 29, 103, 37, 103, 37, 47, 47, 53, 53, 89, 5, 89, 5, 13, 13, 83, 83, 101, 53, 101, 17, 53, 11, 17, 11, 59, 17, 59, 17, 41, 41, 79, 79, 97, 3, 97, 3, 41, 19, 41, 19, 53, 53, 67, 29, 67, 29, 73, 23, 73, 23, 43, 43, 71]

def chunks(l, n):
    # For item i in a range that is a length of l,
    for i in range(0, len(l), n):
        # Create an index range for l of n items:
        yield l[i:i+n]

sliced_list = list(chunks(data, 2))

ordered_list = []

for a in sliced_list:
    # Sort the pairs
    ordered_list.append([a[0], a[1]] if a[0] < a[1] else [a[1], a[0]])

print(ordered_list)

相关问题 更多 >

    热门问题