这些是我的清单
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
如何将项目从一个列表插入到不包含字母数字的位置的其他列表中?
答案 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。