我需要遍历所有元组并将元组的第二项的值更改为第一个“/”之后的第一个字母(AA / BB / CC将成为AA)
列表
[[("AA","AA/BB/AA"),("QQ","AB/AA")],[("CC","CC/SS/AA"),("QQ","CC/CC")],...]
会返回这个:
[[("AA","AA"),("QQ","AB")],[("CC","CC"),("QQ","CC")],...]
我知道如何使用循环并从tupples更改为列表和更改元组...但是有没有办法以更短的方式执行此操作?
提前感谢您的帮助!!
答案 0 :(得分:2)
对于字符串的单个替换工作,您可以使用str.split
通过斜杠拆分字符串。 str.split
将返回从字符串中提取的子字符串列表。由于您只对第一个斜杠之前的子字符串感兴趣,因此您只需要获取结果列表的第一个元素。您可以进一步使用maxsplit
参数来限制str.split
多次拆分字符串(以使其更早地停止处理字符串)。
>>> 'AA/BB/CC'.split('/')
['AA', 'BB', 'CC']
>>> 'AA/BB/CC'.split('/', 1)
['AA', 'BB/CC']
>>> 'AA/BB/CC'.split('/', 1)[0]
'AA'
现在要在列表中执行替换,您有两个选择:您可以替换列表到位,在必要时更新每个元素,或者创建一个新列表,您可以在其中应用转换飞。请注意,您将始终必须创建新元组,因为它们是不可变的。由于它通常是解决问题的首选方式,我只是向您展示如何使用列表理解来实现第二种方式。但是如果你想要替换元素,你只需循环遍历列表并更新列表项。
>>> lst = [[("AA", "AA/BB/AA"), ("QQ", "AB/AA")], [("CC", "CC/SS/AA"), ("QQ", "CC/CC")]]
>>> [[(a, b.split('/', 1)[0]) for a, b in x] for x in lst]
[[('AA', 'AA'), ('QQ', 'AB')], [('CC', 'CC'), ('QQ', 'CC')]]
列表理解通常如下所示:
[t(x) for x in sequence]
对于x
中的每个元素sequence
,它会将转换t
应用于元素x
,并将其作为元素放入列表中。因此[x for x in lst]
只返回一个相同的列表t
将是识别函数。
元素x
也可以是解压缩的元组。如果源列表中的元素是两元素元组,则可以使用[t(a, b) for a, b in lst]
从元组中解包元素,应用转换并将其放入结果列表中。
在你的情况下,我们想要解压缩元组,所以我们只能处理第二个元素。但我们也希望保持元组,所以我们再次将结果放入元组:[(a, t(b)) for a, b in x]
。在这种情况下,转换t
将是我之前展示的分裂。
现在因为你的列表实际上不是元组列表,而是元组列表的列表,我们必须嵌套两个列表推导。与上面[[y for y in x] for x in lst]
类似,将重现列表列表。现在内部列表是一个元组列表,我们可以在那里对元组执行转换并将所有内容放在一起。