1

在下面的代码中,我试图通过迭代作为不同长度、字符串类型的参数提供的所有单词来创建一个新单词。我在这里读到 * 运算符使其成为非关键字可选参数。

def gen_new_word(word1,*nwords):
new_word=''
t0=[i for i in nwords]
t=max(word1,max(t0))
print (t),str(len(t)) #check largest string
for i in xrange(len(t)):
    try:
        print 'doing iter i# %s and try' %(i)
        new_word=new_word+(word1[i]+nwords[i])
        print new_word
    except IndexError,e:
        print 'entered except'
        c=i
        for x in xrange(c,len(t)):
            print 'doing iter x# %s in except' %(x)
            new_word=new_word+t[x]
        break
return new_word

输出:

gen_new_word('janice','tanice','practice')
tanice 6
doing iter i# 0 and try
jtanice
doing iter i# 1 and try
jtaniceapractice
doing iter i# 2 and try
entered except
doing iter x# 2 in except
doing iter x# 3 in except
doing iter x# 4 in except
doing iter x# 5 in except
Out[84]: 'jtaniceapracticenice'

Q1:为什么不给'practice'作为最大字符串,为什么max(word1,max(t0))给tanice?

Q2: t=max(word1,max(t0)) 有效,但 max(word1,nwords) 无效。为什么&有解决方法吗?

Q3:new_word=new_word+(word1[i]+nwords[i])我希望字符串中的单个字母显示出来。期望的结果应该是“jtpaarnnaiicccteeice”,但应该是“jtaniceapracticenice”。由于 * nwords 给出了存储在元组中的第一个元素。我希望 *nwords 将其扩展为单个字符串。我怎样才能做到这一点?我的意思是,从一般意义上讲,我不知道它可能包含多少参数。

4

2 回答 2

1

Q1:为什么 max(word1,max(t0)) 没有给出 'practice' 作为最大字符串,而是给出 tanice

字符串按字典顺序排列。 t>p所以tanice大于practice

Q2: t=max(word1,max(t0)) 有效,但 max(word1,nwords) 无效。为什么&有解决方法吗?

这是因为max需要一个可迭代的或可变数量的参数。在后一种情况下,max尝试将字符串与列表进行比较,而不是将字符串与列表中的每个元素进行比较。你可以使用itertools.chain

max(chain([word1],nwords),key=len)  #assuming you're comparing based on length.

问题 3:...

我不太确定你来这里是为了什么。根据描述,您似乎想在将字符串压缩在一起后将它们链接起来:

from itertools import chain,izip_longest
''.join(chain.from_iterable(izip_longest(word1,*nwords,fillvalue='')))

这是一个没有该功能的示例:

>>> from itertools import chain,izip_longest
>>> words = ('janice','tanice','practice')
>>> ''.join(chain.from_iterable(izip_longest(*words,fillvalue='')))
'jtpaarnnaiicccteeice'

拆包操作员是双向的。你可以用它来表示“我希望这个函数有可变数量的位置参数”:

def foo(*args): ...

或者,“我想向这个函数传递可变数量的位置参数”:

foo(*iterable)

在这里,我使用第二种形式将可变数量的字符串传递给izip_longest1,它接受任意数量的位置参数。

上面的代码等价于:

''.join(chain.from_iterable(izip_longest('janice','tanice','practice',fillvalue='')))

1zip_longest在 python3.x 上

于 2013-05-01T12:26:53.340 回答
0
>>> max("tanice", "practice")
'tanice'
>>>

你应该比较的len(word)不是单词本身!

于 2013-05-01T12:31:37.807 回答