Python中如何堆叠列表?求优化重复值合并函数的方案
Hey there! Let's break down your problems and fix them step by step.
Your current refine function has some tangled logic—you're mixing sorted and original lists, modifying the list while iterating over it, and running into index errors (hence the "Fail" messages). Let's simplify this with two cleaner approaches:
Approach 1: Use collections.Counter (Easiest & Most Pythonic)
The Counter class from the collections module was made exactly for counting element occurrences. We can use it to get counts, then preserve the original order of first appearances:
from collections import Counter def refine(testlist): item_counts = Counter(testlist) seen = set() finalized_terms = [] for item in testlist: if item not in seen: seen.add(item) count = item_counts[item] if count > 1: finalized_terms.append(f"{item}({count})") else: finalized_terms.append(str(item)) return finalized_terms a = [6,0,1,1,1,1,1,2,2,2,2,4,4,4,5,5] print(refine(a)) # Output: ['6', '0', '1(5)', '2(4)', '4(3)', '5(2)']
This keeps the original order of elements from your input list, which is probably what you want (your original function returned elements in reverse sorted order).
Approach 2: Manual Iteration (Great for Learning)
If you want to avoid using Counter, you can iterate through the list and track counts manually:
def refine(testlist): if not testlist: return [] finalized_terms = [] current_item = testlist[0] count = 1 for item in testlist[1:]: if item == current_item: count += 1 else: # Add the previous item to results if count > 1: finalized_terms.append(f"{current_item}({count})") else: finalized_terms.append(str(current_item)) current_item = item count = 1 # Don't forget the last item! if count > 1: finalized_terms.append(f"{current_item}({count})") else: finalized_terms.append(str(current_item)) return finalized_terms a = [6,0,1,1,1,1,1,2,2,2,2,4,4,4,5,5] print(refine(a)) # Output: ['6', '0', '1(5)', '2(4)', '4(3)', '5(2)']
Assuming "stack" means merging multiple lists into one (or repeating a list multiple times), here are the most common methods:
Using the
+operator: Creates a new list by concatenating others (original lists stay unchanged)list1 = [1, 2, 3] list2 = [4, 5, 6] stacked = list1 + list2 print(stacked) # [1, 2, 3, 4, 5, 6]Using
extend(): Modifies the original list by adding elements from another list to its endlist1.extend(list2) print(list1) # [1, 2, 3, 4, 5, 6]Using
itertools.chain: Efficient for merging many lists/iterators (avoids creating intermediate lists)import itertools list3 = [7, 8] stacked = list(itertools.chain(list1, list2, list3)) print(stacked) # [1, 2, 3, 4, 5, 6, 4, 5, 6, 7, 8]Using the
*operator: Repeats a list multiple times (great for stacking the same list)repeated_stack = [0, 1] * 4 print(repeated_stack) # [0, 1, 0, 1, 0, 1, 0, 1]
内容的提问来源于stack exchange,提问作者Jack Larson

