如何将项目从一个列表插入另一个不包含字母数字的位置

时间:2013-08-30 03:14:08

标签: python

这些是我的清单

i=["a","b"]
j=["abc","(3)","ab & ac", "(1,4)","xyz"]

我希望我的输出像这样

j=["abc","a","ab & ac","b","xyz"]

我尝试过这样,

val=0
for item in j:
    if item.isalpha():
        pass
    else:
        elem=i[val]
        j.replace(item, elem)
        val=val+1

如何将项目从一个列表插入到不包含字母数字的位置的其他列表中?

4 个答案:

答案 0 :(得分:1)

这将保留列表j中包含字母的任何列表元素

[s for s in j if any(c in string.letters for c in s)]

答案 1 :(得分:1)

如果你有一个字符或字符串,而不是任何字符串,你可以使用字符串.join方法将列表连接成一个字符串,然后使用正则表达式和re.sub函数来做更换。之后,您可以使用.split方法将字符串分成一个列表:

>>> import re
>>> i=["a","b"]; j=["abc","(3)","ab & ac", "(1,4)","xyz"]
>>> js = "|".join(j) # merge j into one string
>>> print js
abc|(3)|ab & ac|(1,4)|xyz
>>> print re.sub("\(.*?\)", i[0], js)
abc|a|ab & ac|a|xyz
>>> print re.sub("\(.*?\)", i[0], js, count=1)
abc|a|ab & ac|(1,4)|xyz
>>> for r in i:
        js = re.sub("\(.*?\)", r, js, count=1)


>>> print js
abc|a|ab & ac|b|xyz

最后的循环显示了如何做到这一点。带括号的字段将从左到右一次填充一个。把它放回一个清单:

jnew = js.split("|")

......你已经完成了。

答案 2 :(得分:1)

假设“ab& ac”是不是字母数字(因为&和空格)并且您输了一个错字,这就行了。

def removeNonAlpha(i,j):
    indexI = 0
    indexJ = 0
    while indexJ < len(j):
        if not j[indexJ].isalnum():
            j[indexJ] = i[indexI]
            indexI += 1
        indexJ += 1
    return j

>>>i=["a","b", "c"]
>>>j=["abc","(3)","ab & ac", "(1,4)","xyz"]
>>>removeNonAlpha(i,j)
['abc', 'a', 'b', 'c', 'xyz']

此代码还假设您在i中有足够的元素来完全替换j。

如果由于某些特殊原因你需要允许&amp; 标志(这意味着你还需要允许这些空格),可以选择以下方法:

def removeNonAlpha(i,j):
    indexI = 0
    indexJ = 0
    while indexJ < len(j):
        if not j[indexJ].replace('&', '').replace(' ', '').isalnum():
            j[indexJ] = i[indexI]
            indexI += 1
        indexJ += 1
    return j

>>>i=["a","b"]
>>>j=["abc","(3)","ab & ac", "(1,4)","xyz"]
>>>removeNonAlpha(i,j)
['abc', 'a', 'ab & ac', 'b', 'xyz']

答案 3 :(得分:0)

目前尚不清楚您对“字母数字”的定义是什么。你的例子使用isalpha,“ab&amp; ac”失败,正如DSM指出的那样。如果isalpha是“字母数字”的可接受定义,并且可以修改数组,那么我建议如下:

for index, item in enumerate(j):
    if not item.isalpha():
        j[index] = i.pop(0) if i else None

可能有一个列表理解版本,但它会很混乱。

请注意,根据您的示例输入,上面的代码会产生以下结果:

['abc', 'a', 'b', None, 'xyz']

那是因为i中实际上没有足够的项目来覆盖j的所有非字母数字成员,所以在这种情况下我使用了None。