【问题标题】:Print only the list items that contain a certain character仅打印包含特定字符的列表项
【发布时间】:2015-09-16 03:53:41
【问题描述】:

如果字符串以某个字符开头并在字符串中重复,我正在尝试将计数加一。这是我的代码

def stringMatch(list1, char):
    count = 0
    for i in range(len(list1)):
        if char == list1[i][:]:
            count = count + 1 
            print(list1[i], count)

对于输入 list1 = ['cat', 'dog', 'corn']char = 'c'

输出应该是

cat 1
corn 1 

【问题讨论】:

  • 那个悬挂的 if 语句是什么?
  • @inspectorG4dget 你是什么意思?
  • 你的问题是什么?
  • 你的帖子中有一行写着if list1 = ['cat', 'dog', 'corn'] and char = 'c',它不包含在你的代码中。因此我不明白它的目的是什么
  • 我认为这只是“考虑到这些输入”的事情。

标签: python list python-3.4


【解决方案1】:

在您的代码中,您使用if char == list1[i][:]。这会导致您的问题。

list1[i][:]list1[i] 相同,这实际上不是您想要做的。你不想看看list1[i]是不是char;相反,您想知道list1[i] 包含 char。您可以通过多种方式实现这一点。以下是三个:

  1. char in list1[i]
  2. 这个for循环:
found = False
for c in list1[i]:
    if c == char:
        found = True
        break
  1. if any(char==c for c in list1[i])

无论如何,这就是我要做的:

def stringMatch(L, char):
    counts = (char in word for word in L)  # compute the counts of `char` in each list item
    for word, count in zip(L, counts):
        if not count: continue
        print(word, count)

【讨论】:

  • 谢谢!你知道为什么我的代码可能不起作用吗?
  • @FriedFish:那里!我在文本中添加了解释
  • 非常感谢!对一开始的所有混乱表示抱歉!
  • 方法 2 通常应该在 if 子句中包含一个 break 语句,这样它就不会不必要地继续检查剩余的字符。
  • 此外,您使用的最终方法还不必要地计算了char 的出现次数。做你想做的事情的最简单(因此也是pythonic)的方法绝对是你的方法1,而不是。 PS:这是假设问题是问题的标题(无需计数,仅出于调试目的打印在原始代码中)。
【解决方案2】:

在 python 中计算字符串中的字符非常容易。有一个用于计数的内置函数:string.count(char)。您当前的计数方法不起作用有两个原因。

  • 检查字母是否在字符串中的方式不起作用。让我们尝试一个测试用例:

    >>>'c' == 'cat'[:]
    False
    

    使用这种方法,你本质上是在询问 'c' 是否等于整个字符串,这显然是错误的。更好的方法是使用in 关键字。让我们试试前面的例子。

    >>>'c' in 'cat'
    True
    

    因此,如果我们要使用此方法,我们将使用更具 Python 风格的 in 关键字。但是,我们不需要它。

  • 假设我们使用上述方法(正如我上面所说,我们不会),您的输出中仍然会出现错误。根据您想要的输出,我们正在计算每个单词中的字符,是吗?但是,您当前的设置方式会在每次计算该字符时增加总计数变量。所以你的输出是:

    cat 1
    corn 2
    

    这是一个简单的解决方法。我们只需要在 for 循环中移动变量,以便它每次递增时都会重置。它看起来像这样:

    for i in list1:
        total = 0
        if char in i:
            total += 1
            print(i, total)
    

    但是,即使那样,它也不是一个真正准确的循环,因为我们想要计算每个单词中的字符,对吗?这(和您自己的方法)仅在字符存在于单词中时才有效。具有讽刺意味的是,in 关键字不会出现在此解决方案中。相反,我们需要计算每个单词的每个字母来解决这个问题。这是您的新代码:

    for word in list1:
        total = 0
        for letter in word:
            if letter == char:
                total += 1
                print(word, total)
    

好吧,就像我在开头所说的那样,还有一种更简单的方法。使用string.count() 函数,整个函数的代码现在只有四行。请注意,我更改了您的函数名称。按照惯例,在 python 中不鼓励使用 camelCase,小写/下划线是惯例。请务必阅读PEP 8, python's style-guide, 以了解约定。无论如何,这是你的代码:

    def string_match(list1, char):
        for i in list1:
            if i.count(char) > 0:
                print(i, i.count(char))

【讨论】:

    【解决方案3】:

    您只需要使用string.count()

    >>> a = list1 = ['cat', 'dog', 'corn'] 
    >>> a = { i:i.count('c') for i in list1 if i.count('c') > 0}
    >>> for w in a:
    ...     print w, a[w]
    ...  
    corn 1
    cat 1
    

    【讨论】:

    • 任何没有字符的单词都不能打印
    • 更新,之前没有注意到预期的输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2021-07-16
    相关资源
    最近更新 更多