繁体   English   中英

如何遍历字符串列表中的每个字符串并对其元素进行操作?

[英]How to iterate over each string in a list of strings and operate on its elements?

给定一个列表:

words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']

我需要比较列表中每个字符串的第一个和最后一个元素。 如果字符串中的第一个和最后一个元素相同,则增加计数。

如果我手动尝试,我可以遍历列表中字符串的每个元素:

words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']
w1 = words[0]
print w1
aba

for i in w1:
   print i
 
a
b
a

if w1[0] == w1[len(w1) - 1]:
   c += 1
   print c
 
1

但是,当我尝试使用for循环遍历列表中所有字符串的所有元素时,出现错误。

words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']
c = 0
for i in words:
     w1 = words[i]
     if w1[0] == w1[len(w1) - 1]:
       c += 1
     print c

错误:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: list indices must be integers, not str

如何比较字符串列表的第一个和最后一个元素?

尝试:

for word in words:
    if word[0] == word[-1]:
        c += 1
    print c

for word in words返回的项目words ,而不是指数。 如果您有时需要索引,请尝试使用enumerate

for idx, word in enumerate(words):
    print idx, word

会输出

0, 'aba'
1, 'xyz'
etc.

-1word[-1]以上是说“最后一个元素”的Python的方式。 word[-2]会给你倒数第二个元素,依此类推。

您也可以使用生成器来实现这一点。

c = sum(1 for word in words if word[0] == word[-1])

原因是在您的第二个示例中, i是单词本身,而不是单词的索引。 所以

for w1 in words:
     if w1[0] == w1[len(w1) - 1]:
       c += 1
     print c

将相当于您的代码。

使用range(len())等同于使用enumerate()是不正确的。 它们返回相同的结果,但它们并不相同。

使用enumerate()实际上为您提供了键/值对。 使用range(len())不会。

让我们首先检查range(len()) (从原始海报的示例中工作):

words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']
    print range(len(words))

这给了我们一个简单的列表:

[0, 1, 2, 3, 4]

...并且此列表中的元素用作我们结果中的“索引”。

所以让我们对enumerate()版本做同样的事情:

words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']    
   print enumerate(words)

这当然不会给我们一个列表:

<enumerate object at 0x7f6be7f32c30>

...所以让我们把它变成一个列表,看看会发生什么:

print list(enumerate(words))

它给了我们:

[(0, 'aba'), (1, 'xyz'), (2, 'xgx'), (3, 'dssd'), (4, 'sdjh')]

这些是实际的键/值对。

所以这...

words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']

for i in range(len(words)):
    print "words[{}] = ".format(i), words[i]

... 实际上采用第一个列表 (Words),并创建第二个简单列表,其范围由第一个列表的长度指示。

所以我们有两个简单的列表,我们只是从每个列表中打印一个元素以获得我们所谓的“键/值”对。

但它们并不是真正的键/值对; 它们只是从不同列表中同时打印的两个单个元素。

enumerate ()代码:

for i, word in enumerate(words):
    print "words[{}] = {}".format(i, word)

... 还创建了第二个列表。 但该列表实际上一个键/值对列表,我们要求来自单个来源的每个键和值——而不是来自两个列表(就像我们上面所做的那样)。

所以我们打印相同的结果,但来源完全不同——处理方式也完全不同。

以下代码输出第一个和最后一个字母相等的单词数。 使用python 在线编译器进行测试和验证:

words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']  
count = 0  
for i in words:  
     if i[0]==i[-1]:
        count = count + 1  
print(count)  

输出:

$python main.py
3
c=0
words = ['challa','reddy','challa']

for idx, word in enumerate(words):
    if idx==0:
        firstword=word
        print(firstword)
    elif idx == len(words)-1:
        lastword=word
        print(lastword)
        if firstword==lastword:
            c=c+1
            print(c)

您正在遍历单词中的项目,但您必须遍历项目的长度:

words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']
c = 0
for i in range(len(words)):
    w1 = words[i]
    if w1[0] == w1[len(w1) - 1]:
      c += 1
    print (c)

在您的情况下, i[0] 是 'aba' 因为 i 是根据单词中的项目计算的:

words = ['aba', 'xyz', 'xgx', 'dssd', 'sdjh']
c = 0
for i in words:
print(i)

输出是:

阿坝

您可以使用sum()和生成器表达式来解决此问题。 当被解释为整数时,为True的布尔值的值为1 ,为False的布尔值的值为0 因此,我们可以执行以下操作:

sum(word[0] == word[-1] for word in words)

使用 range() 代替,如下所示:

for i in range(len(words)):
    ...
for i,j in enumerate(words): # i---index of word----j
     #now you got index of your words (present in i)
     print(i) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM