如何通过*(Python)"join"部分隐藏的数字



我会尽可能简单。

假设您有一个元组列表,例如:

[('0000************', 'b'), ('****1234********', 'a'),
('****1111****3333', 'b')]

我怎么能把同一类型的数字相加呢。基本上把上面的例子变成这样:

[('****1234********', 'a'), ('00001111****3333', 'b')]

一个可能的解决方案是:创建一个由第二个值索引的第一个值的字典,当发现重复的第二个数值时,合并第一个数值(在这种情况下,我优先考虑第一个数值(。然后将该字典转换回元组列表:

tups = [('0000************', 'b'), ('****1234********', 'a'), ('****1111****3333', 'b')]
def merge_nums(n, m):
return ''.join(a if a != '*' else b for a, b in zip(n, m))
out = {}
for (v, k) in tups:
out[k] = merge_nums(out[k], v) if k in out else v
res = [(v, k) for k, v in out.items()]
print(res)

输出:

[('****1234********', 'a'), ('00001111****3333', 'b')]

不确定它的效率有多高,但这是有效的。请注意,如果每个类型在同一索引处都有值,则可能会覆盖数字。

x = [('0000************', 'b'), ('****1234********', 'a'), ('****1111****3333', 'b')]
types = {}
for y in x:
if y[1] in types:
i = 0
for z in y[0]:
if z != '*':
types[y[1]] = types[y[1]][0:i] + z + types[y[1]][i:-1]
i += 1
else:
types[y[1]] = y[0]
print(types)

假设只需要匹配字符串对,其中一个有数字,另一个没有,则可以循环遍历所有可能的元组对,在匹配时提取元组,然后组合它们的字符串。我扩展了您的元组示例列表,以表明代码是可推广的。

import itertools
list_of_tuples = [('0000************', 'b'), ('****1234********', 'a'),
('****1111****3333', 'b'), ('0000************', 'a')]
# combine two strings of the same length by digit
def combine_strings(str1, str2):
new_string = ''
for index, char in enumerate(str1):
if char.isdigit():
new_string += char
else:
new_string += str2[index]
return new_string
# return all pairs of tuples that have a matching second element
def get_pairs(list_of_tuples):
all_matches = []
for pair in itertools.combinations(list_of_tuples, 2):
if pair[0][1] == pair[1][1]:
all_matches.append(pair)
return all_matches
def combine_tuples(tuple1, tuple2):
return (combine_strings(tuple1[0], tuple2[0]), tuple1[1])
all_matched_tuples = get_pairs(list_of_tuples) 
print(all_matched_tuples)
list_matched_tuples = []
for pair in all_matched_tuples:
list_matched_tuples.append(combine_tuples(pair[0], pair[1]))

输出:

> list_matched_tuples
[('00001111****3333', 'b'), ('00001234********', 'a')]

您可以使用itertools.groupby:

from itertools import groupby as gb
d = [('0000************', 'b'), ('****1234********', 'a'), ('****1111****3333', 'b')]
def merge(vals):
return ['*' if not (x:=list(filter(str.isdigit, j))) else x[0] for j in zip(*vals)]
r = [(''.join(merge([j for j, _ in b])), a) for a, b in gb(sorted(d, key=lambda x:x[-1]), key=lambda x:x[-1])] 

输出:

[('****1234********', 'a'), ('00001111****3333', 'b')]

相关内容

  • 没有找到相关文章

最新更新