基于对应位置值合并含None元素的两个列表的技术问询
Merging Two Lists with None Values by Priority
Hey there, let's tackle this list merging problem you've got. Based on your example and the rules you outlined, here's a solid way to implement the merging logic clearly and reliably.
First, let's formalize the merging rules we need to follow:
- If both elements at position
iare the same (including both beingNone), use that value in the result - If one element is a valid value and the other is
None, take the valid value for the result - If both are
None, keepNonein the result - Bonus: We'll add a check for conflicting non-None values (since your original note mentions assuming values are either same or missing) to catch unexpected edge cases.
Implementation Code
Here's a readable, maintainable version of the function:
def combine_predictions(a, b): """Merge two lists where corresponding elements are either equal, one is None, or both are None. Args: a (list): First input list with possible None values b (list): Second input list with possible None values Returns: list: Merged list following the priority rules Raises: ValueError: If lists are different lengths or have conflicting non-None values """ # First validate input lengths match if len(a) != len(b): raise ValueError("Input lists a and b must have the same length") merged_list = [] for idx, (a_val, b_val) in enumerate(zip(a, b)): # Case 1: Both values are identical (including both None) if a_val == b_val: merged_list.append(a_val) # Case 2: One is None, take the non-None value elif a_val is None: merged_list.append(b_val) elif b_val is None: merged_list.append(a_val) # Case 3: Conflicting non-None values (breaks the original assumption) else: raise ValueError(f"Conflicting values at index {idx}: {a_val} vs {b_val}") return merged_list
Test It With Your Example
Let's run this function against your sample inputs to confirm it works:
a = [1, None, 0, 1, None, None] b = [1, 0, None, None, 0, None] c = combine_predictions(a, b) print(c) # Output: [1, 0, 0, 1, 0, None]
How It Works
- We start by checking that the input lists are the same length—this prevents silent errors from mismatched data.
- For each pair of elements:
- First, we handle matches (including both being
None) since that's the simplest case. - Then we check if one value is
Noneand pick the valid one. - Finally, we raise an error if both values are non-None but different—this enforces the assumption mentioned in your original code comment, so you catch issues early.
- First, we handle matches (including both being
Concise Alternative (For Those Who Prefer It)
If you want a shorter version using a list comprehension (note: it's less readable for complex logic):
def combine_predictions(a, b): if len(a) != len(b): raise ValueError("Lists must be same length") return [ b_val if a_val is None else a_val if b_val is None else a_val if a_val == b_val else ValueError(f"Conflict at index {i}: {a_val} vs {b_val}") for i, (a_val, b_val) in enumerate(zip(a, b)) ]
内容的提问来源于stack exchange,提问作者jdoe
相关产品推荐
相关产品推荐

