Python中元组的多字符串替换
我想用替换集替换元组中的多个字符串元素Python中元组的多字符串替换,python,Python,我想用替换集替换元组中的多个字符串元素 from itertools import chain old = [('Jack','Mike'),('Rosa','Mike'),('Pete','Jake'),('Beth','Jake')] uniquelist = list(dict.fromkeys([ i for i in chain(*old)])) replaceset = [("a" + str(new),old) for new,old in enumerate(uniquelis
from itertools import chain
old = [('Jack','Mike'),('Rosa','Mike'),('Pete','Jake'),('Beth','Jake')]
uniquelist = list(dict.fromkeys([ i for i in chain(*old)]))
replaceset = [("a" + str(new),old) for new,old in enumerate(uniquelist)]
replaceset
是:
[('a0', 'Jack'), ('a1', 'Mike'), ('a2', 'Rosa'), ('a3', 'Pete'), ('a4', 'Jake'), ('a5', 'Beth')]
这是我想要从old
获得的输出
[('a0','a1'),('a2','a1'),('a3','a4'),('a5','a4')]
有什么办法解决这个问题吗?我在这里假设您使用的是Python 3.7+,维护秩序对您很重要。 只需将
replaceset
转换为dict,然后用列表重新创建old
:
from itertools import chain
old = [('Jack','Mike'),('Rosa','Mike'),('Pete','Jake'),('Beth','Jake')]
uniquelist = list(dict.fromkeys([ i for i in chain(*old)]))
#replaceset = [("a" + str(new),old) for new,old in enumerate(uniquelist)]
replaceset = {old:"a" + str(new) for new, old in enumerate(uniquelist)}
res = [tuple(replaceset[name] for name in sub) for sub in old]
print(res) # [('a0', 'a1'), ('a2', 'a1'), ('a3', 'a4'), ('a5', 'a4')]
作为旁注
uniquelist = dict.fromkeys(chain(*old))
也会使您更高效。我在这里假设您使用的是Python 3.7+,维护秩序对您很重要。 只需将
replaceset
转换为dict,然后用列表重新创建old
:
from itertools import chain
old = [('Jack','Mike'),('Rosa','Mike'),('Pete','Jake'),('Beth','Jake')]
uniquelist = list(dict.fromkeys([ i for i in chain(*old)]))
#replaceset = [("a" + str(new),old) for new,old in enumerate(uniquelist)]
replaceset = {old:"a" + str(new) for new, old in enumerate(uniquelist)}
res = [tuple(replaceset[name] for name in sub) for sub in old]
print(res) # [('a0', 'a1'), ('a2', 'a1'), ('a3', 'a4'), ('a5', 'a4')]
作为旁注
uniquelist = dict.fromkeys(chain(*old))
也会起作用,使您的效率更高。如果您将replaceset设置为dict,这将是微不足道的。如果您将replaceset设置为dict,这将是微不足道的。酷!谢谢你让我知道这样的方式:“也不要使用<代码> DICT.OFFICKEX/CODE >,考虑使用<代码> SET(链(*HOLD))< /COD>(或<代码> FROZESETSE< /COD>),更好地表达意图。<代码> [我在In链(*HOLD)] 看起来是WiRD。链(*old)不起作用吗?无论如何,最好做
list(chain(*old))
@OliverW。对于set
它不起作用,因为集合不保留插入顺序。我相信OP希望在重复检测的基础上增加插入顺序。@Jean-franoisfabrechain(*old)
确实有效;见旁注。但是,我们不能在这里使用list
,因为这无法消除重复的值,dict
调用稍后将覆盖它们。酷!谢谢你让我知道这样的方式:“也不要使用<代码> DICT.OFFICKEX/CODE >,考虑使用<代码> SET(链(*HOLD))< /COD>(或<代码> FROZESETSE< /COD>),更好地表达意图。<代码> [我在In链(*HOLD)] 看起来是WiRD。链(*old)不起作用吗?无论如何,最好做list(chain(*old))
@OliverW。对于set
它不起作用,因为集合不保留插入顺序。我相信OP希望在重复检测的基础上增加插入顺序。@Jean-franoisfabrechain(*old)
确实有效;见旁注。但是,我们不能在这里使用list
,因为这无法消除重复的值,dict
调用稍后将覆盖它们。