Tìm các ký tự cụ thể trong danh sách


11

Mục tiêu là tạo một danh sách từ đoạn văn của người dùng và lặp đi lặp lại để tôi có thể đếm được có bao nhiêu từ chứa các chữ cái đặc biệt "j, x, q, z".

Ví dụ đầu vào:
Trong một lỗ trên mặt đất, có một hobbit. Không phải là một cái hố bẩn thỉu, bẩn thỉu, ẩm ướt, đầy những đầu giun và mùi khét, cũng không phải là một cái hố cát khô, trơ trụi, không có gì trong đó để ngồi xuống hoặc ăn; đó là một lỗ hobbit, và điều đó có nghĩa là sự thoải mái.

Ví dụ đầu ra: 1 từ có ký tự hiếm

Tôi đã bắt đầu mã nơi tôi chia đoạn văn của người dùng thành một danh sách nhưng tôi gặp khó khăn khi lặp qua danh sách và tìm từng phiên bản của các chữ cái đặc biệt.

Đây là những gì tôi có cho đến nay:

def rareChar(words):
    rareWords = 0
    rareChars = ['j', 'x', 'q', 'z']
    for astring in words:
        wds = words.split()
        for char in wds:
            if char in rareChars:
                rareWords = rareWords + 1
    return rareWords

def CoolPara(words):
    print(rareChar(words), 'word(s) with a rare character')

    # DO NOT CHANGE CODE BELOW

    print(CoolPara(input("Enter: ")))

Nếu tôi chạy với đầu vào ví dụ, tôi nhận được đầu ra '0 từ (s) với một ký tự hiếm'. Làm thế nào tôi có thể sửa lỗi này để tôi có thể nhận được đầu ra mong đợi. Bất kỳ trợ giúp sẽ được đánh giá rất cao vì tôi vẫn còn khá mới đối với tiền mã hóa

Ngoài ra một lưu ý nhanh: Tôi chỉ được phép sử dụng các phương thức / hàm của split () và Len ()


.indexnên thực hiện công việc
bigbounty

Bạn nên đi qua đầu ra và thêm một số câu lệnh in để đảm bảo các câu lệnh và điều kiện được đáp ứng.
Fallenreaper

lỗi đánh máy không nên dòng trên vòng lặp bên trong là wds = Astring.split ()
abhilb

Mục đích của là for astring in words:gì?
norok2

Từ tên biến tôi nghĩ bạn đang nhầm lẫn. Thay đổi "for Astring in words:" thành "for word in words.split ():". Sau đó "for char in wds:" to for char in word: ". Và xóa" wds = words.split () ".
kantal

Câu trả lời:


4

Có lẽ đây có thể là một cơ hội để giới thiệu cho bạn một số tính năng của python:

from typing import List


def rare_char(sentence: str, rare_chars: List[str]=["j", "x", "q", "z"]) -> List[str]:
    return [word for word in sentence.split() if 
            any(char in word for char in rare_chars)]


def cool_para(sentence: str) -> str:
    return f"{len(rare_char(sentence))} word(s) with rare characters"

Câu trả lời này sử dụng:

  1. , có thể được sử dụng bởi các công cụ của bên thứ ba như trình kiểm tra loại, IDE, linters, nhưng quan trọng hơn là làm cho ý định của bạn rõ ràng với những người khác có thể đang đọc mã của bạn.
  2. đối số mặc định , thay vì mã hóa chúng bên trong hàm. Điều rất quan trọng là ghi lại các chức năng của bạn, để người dùng không bị bất ngờ về kết quả này (xem Nguyên tắc tối thiểu ngạc nhiên ). Có rất nhiều cách trình khác của tài liệu mã của bạn (xem docstrings ) và những cách khác của việc thiết kế giao diện đó (có thể là một lớp chẳng hạn), nhưng điều này chỉ là để chứng minh điểm.
  3. Liệt kê các cách hiểu , có thể làm cho mã của bạn dễ đọc hơn bằng cách làm cho nó trở nên khai báo hơn thay vì bắt buộc . Có thể khó xác định ý định đằng sau các thuật toán bắt buộc.
  4. nội suy chuỗi , theo kinh nghiệm của tôi ít xảy ra lỗi hơn so với nối.
  5. Tôi đã sử dụng hướng dẫn kiểu pep8 để đặt tên cho các hàm, đây là quy ước phổ biến nhất trong thế giới python.
  6. Cuối cùng, thay vì in tôi trở về một strtrong các cool_parachức năng vì mã dưới # DO NOT CHANGE CODE BELOWcomment được in kết quả của lời gọi hàm.

1
Một trong những triển khai tốt nhất tôi từng thấy cho đến nay. Không thể là Pythonic hơn. :-) Tôi sẽ đổi tên rare_chars()thành find_rare_words()thay thế.
accdias

1

Lý tưởng nhất là bạn muốn sử dụng danh sách hiểu.

def CoolPara(letters):
  new = [i for i in text.split()]
  found = [i for i in new if letters in i]
  print(new) # Optional
  print('Word Count: ', len(new), '\nSpecial letter words: ', found, '\nOccurences: ', len(found))

CoolPara('f') # Pass your special characters through here

Điều này mang lại cho bạn:

['In', 'a', 'hole', 'in', 'the', 'ground', 'there', 'lived', 'a', 'hobbit.', 'Not',
 'a', 'nasty,', 'dirty,', 'wet', 'hole,', 'filled', 'with', 'the', 'ends', 'of',
'worms', 'and', 'an', 'oozy', 'smell,', 'no', 'yet', 'a', 'dry,', 'bare,', 'sandy',
'hole', 'with', 'nothing', 'in', 'it', 'to', 'sit', 'down', 'on', 'or', 'to', 'eat;',
'it', 'was', 'a', 'hobbit-hole,', 'and', 'that', 'means', 'comfort']
Word Count:  52
Special letter words:  ['filled', 'of', 'comfort']
Occurences:  3

0
def rareChar(words):
rareWords = 0
rareChars = ['j', 'x', 'q', 'z']

#Split paragraph into words
words.split()
for word in words:
    #Split words into characters
    chars = word.split()
    for char in chars:
        if char in rareChars:
            rareWords = rareWords + 1
return rareWords

def CoolPara(words):
    #return value rather than printing
    return '{} word(s) with a rare character'.format(rareChar(words))


# DO NOT CHANGE CODE BELOW

print(CoolPara(input("Enter: ")))

Đầu vào: Xin chào, đây là một câu về sở thú

Đầu ra: 1 từ với một ký tự hiếm


0

Đoạn mã sau đây là bản chỉnh sửa của bạn, kết quả là câu trả lời đúng của 1

def main():

    def rareChar(words):
        rareWords = 0
        rareChars = ['j', 'x', 'q', 'z']

        all_words = list(words.split())

        for a_word in all_words:
            for char in a_word:
                if char in rareChars:
                    rareWords = rareWords + 1
        return rareWords

    def CoolPara(words):
        print(rareChar(words), 'word(s) with a rare character')


    # DO NOT CHANGE CODE BELOW

    print(CoolPara(input("Enter: ")))

main()

Câu trả lời:

C:\Users\Jerry\Desktop>python Scraper.py
Enter: In a hole in the ground there lived a hobbit. Not a nasty, dirty, wet hole, filled with the ends of worms and an oozy smell, no yet a dry, bare, sandy hole with nothing in it to sit down on or to eat; it was a hobbit-hole, and that means comfort.

1 word(s) with a rare character

0

Mã này sẽ làm việc cho bạn. Bỏ ghi chú các từ nhập và nhận ra câu lệnh chuỗi từ mà tôi đã sử dụng để kiểm tra mã.

Phương pháp para là không cần thiết.

def rareChar(words):
    rareWords = 0
    rareChars = ['j', 'x', 'q', 'z']
    for word in words:
        wds = word.split()
        for char in wds:
            if char in rareChars:
                rareWords = rareWords + 1
    return rareWords

words = 'john xray quebec zulu'
# words = (input("Enter: "))

x = rareChar(words)
print(f"There are {x} word(s) with a rare character")

0

Giải pháp được cung cấp bởi Barb hoạt động cho một chữ cái duy nhất:

CoolPara ('f')

Nhưng nó không hoạt động với các nhân vật mulitple như yêu cầu của người đăng ban đầu. Ví dụ: điều này không trả về kết quả chính xác:

CoolPara ("jxqz")

Đây là phiên bản cải tiến của giải pháp Barb's:

def CoolPara(letters):
    new = [i for i in text.split()]
    found = list()
    for i in new:
        for x in i:
            for l in letters:
                if x == l:
                    found.append(i)
    print("Special letter words: ", found)
    print("word(s) with rare characters ", len(found))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.