用python3中的特定元素替换元素组

问题描述 投票:-1回答:5

我有一个超过50个元素的列表。这些元素是小写和大写字母,数字,特殊字符。

例如。

sample_list = ['1', '0', 'b', 'B', '2', '6', 'a', '7', '9', '5', 'c', 'd', '4', 'A', 'C', 'f', 'D', 'F', '3', 'C', '8', 'A', 'F', 'B', 'A', 'A', 'D'] 

我想用特殊字符交换特定元素。例如。

replacing `A,B,C and 1 with @
replacing `D,E,F and 2 with &
replacing `G,H,I and 3 with (

等等,我必须用11个选定的特殊字符替换一组特定的元素。就像我用3个特殊字符替换了几个选中的元素。

如何有效地做到这一点。

python python-3.x list replacewith
5个回答
6
投票

您可以使用translate方法执行以下操作:

sample_list = ['1', '0', 'b', 'B', '2', '6', 'a', '7', '9', '5', 'c', 'd', '4', 'A', 'C', 'f', 'D', 'F', '3', 'C', '8', 'A', 'F', 'B', 'A', 'A', 'D']
t = ''.maketrans('ABC1DEF2GHI3','@@@@&&&&((((')
out = [i.translate(t) for i in sample_list]
print(out)

输出:

['@', '0', 'b', '@', '&', '6', 'a', '7', '9', '5', 'c', 'd', '4', '@', '@', 'f', '&', '&', '(', '@', '8', '@', '&', '@', '@', '@', '&']

maketransstr方法用于创建转换表,只需用两个相等长度的strs来提供它,第一个包含键和第二个值。 translate方法接受该表并相应地替换字符,或者如果表中没有这样的键则保持原始完整。

编辑:如OlivierMelançon所述,只有当你想用1个字符替换1个字符时才可以使用它。


0
投票

您首先需要定义替换规则,例如使用dict。特别是,由于dict允许O(1)访问,这与您的方法能够获得时间复杂度的速度一样快:这是在列表的单个遍历中解决它。

然后,您可以遍历列表并替换每个元素(如果它具有替换规则)。

rules = {
    'A': '@',
    'B': '@',
    'D': '&',
    'E': '&'
}

for i, c in enumerate(sample_list):
    if c in rules:
        sample_list[i] = rules[c]

如果您希望创建新列表而不是改变初始列表,则可以使用列表推导

new_list = [rules.get(c, c) for c in sample_list]

rules = {
    'A': '@',
    'B': '@',
    'D': '&',
    'E': '&'
}

sample_list = ['A', 'A', 'B', 'C', 'D', 'E', 'F']

new_list = [rules.get(c, c) for c in sample_list]

print(new_list)

产量

['@', '@', '@', 'C', '&', '&', 'F']

0
投票

试试这个并在字典中设置你的所有maping:

chars = {"@": ["A", "B", "C", "1"], "&": ["D", "E", "F", "2"]}
sample_list = ['1', '0', 'b', 'B', '2', '6', 'a', '7', '9', '5', 'c', 'd', '4', 'A', 'C', 'f', 'D', 'F', '3', 'C', '8', 'A', 'F', 'B', 'A', 'A', 'D']

for k, v in chars.items():
    for value in v:
        if value in sample_list:
            ind = [index for index, val in enumerate(sample_list) if val == value]            
            for x in ind:
                sample_list[x] = k


print(sample_list)

0
投票

您可以使用地图功能:

第一次更换的Ex:

new_list = map(lambda x: '@' if x in ('A', 'B', 'C') else x, sample_list)

sample_list也可以是一个字符串(每个字符都是一个元素,但map将以任一方式返回一个数组)。

在“字符串”列表中,您可以使用replace方法:

compact_list = ''.join(sample_list)
new_compact_list = compact_list.replace('A', '@').replace('B', '@').replace('C', '@')

当然,如果源列表是可变的,请在它周围写一个循环...


0
投票

从一个简单的函数开始并对其进行优化。

简单的是使用3个sets(对于查找集比列表更好) - 如果集合不需要变异,请改用frozensets。使用简单的循环 - 直接:

sample_list = ['1', '0', 'b', 'B', '2', '6', 'a', '7', '9', '5', 'c', 'd', '4', 'A', 'C', 'f', 'D', 'F', '3', 'C', '8', 'A', 'F', 'B', 'A', 'A', 'D'] 

new_list = []
for item in sample_list:
    abc = frozenset("ABC")    # frozensets do not change, they are immuteable
    dfe = frozenset("DEF")    # and fast for lookups. this is less performant
    ghi = frozenset("GHI")    # then using a dict - but it works as well

    if item in abc:
        new_list.append("@")
    elif item in dfe:
        new_list.append("&")
    elif item in ghi:
        new_list.append("(")
    else:
        new_list.append(item)

print(new_list)

输出:

['1', '0', 'b', '@', '2', '6', 'a', '7', '9', '5', 'c', 'd', '4', '@', '@', 'f', '&', '&', '3', '@', '8', '@', '&', '@', '@', '@', '&']

要获得更多花哨的使用字典和list-comp:

transform = {"A":"@", "B":"@", "C":"@", 
             "D":"&", "E":"&", "F":"&", 
             "G":"(", "H":"(", "I":"("}

new_list = [ transform.get(i,i) for i in sample_list]

输出:

['1', '0', 'b', '@', '2', '6', 'a', '7', '9', '5', 'c', 'd', '4', '@', '@', 'f', '&', '&', '3', '@', '8', '@', '&', '@', '@', '@', '&']

看到:

© www.soinside.com 2019 - 2024. All rights reserved.