如果以字典顺序输入三个单词,则创建一个打印为true的程序

Joe*_*gle 7 python string lexicographic python-3.x

我正在尝试创建一个程序,询问用户三个单词,如果按字典顺序输入单词,则打印'True'.例如:

Enter first word: chicken

Enter second word: fish

Enter third word: zebra

True
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我的代码:

first = (input('Enter first word: '))
second = (input('Enter second word: '))
third = (input('Enter third word: '))
s = ['a','b','c','d','e','f','g','h',
     'i','j','k','l','m','n','o','p',
     'q','r','s','t','u','v','w','x',
     'y','z','A','B','C','D','E','F',
     'G','H','I','J','K','L','M','N',
     'O','P','Q','R','S','T','U','V',
     'W','Z','Y','Z']
if s.find(first[0]) > s.find(second[0]) and s.find(second[0]) >                                  s.find(third[0]):
    print(True)
Run Code Online (Sandbox Code Playgroud)

Ana*_*mar 8

如果你处理一个任意长度的列表,我相信使用sorted()其他答案表明适用于小列表(小字符串),当涉及到更大的列表和更大的字符串和案例(以及列表可以随机排序的情况)更快的方法是使用all()内置函数和生成器表达式(这应该比sorted()方法更快).示例 -

#Assuming list is called lst
print(all(lst[i].lower() < lst[i+1].lower() for i in range(len(lst)-1)))
Run Code Online (Sandbox Code Playgroud)

请注意,上面将最终调用str.lower()每个字符串(第一个和最后一个)两次.除非你的字符串非常大,否则这应该没问题.

如果您的字符串与列表的长度相比确实非常大,则可以在执行all()以小写形式存储所有字符串之前创建另一个临时列表.然后在该列表上运行相同的逻辑.

您可以使用列表推导创建列表(通过从用户获取输入),示例 -

lst = [input("Enter word {}:".format(i)) for i in range(3)] #Change 3 to the number of elements you want to take input from user.
Run Code Online (Sandbox Code Playgroud)

上述方法的时序结果vs sorted()(修改后的代码sorted()不敏感地工作) -

In [5]: lst = ['{:0>7}'.format(i) for i in range(1000000)]

In [6]: lst == sorted(lst,key=str.lower)
Out[6]: True

In [7]: %timeit lst == sorted(lst,key=str.lower)
1 loops, best of 3: 204 ms per loop

In [8]: %timeit all(lst[i].lower() < lst[i+1].lower() for i in range(len(lst)-1))
1 loops, best of 3: 439 ms per loop

In [11]: lst = ['{:0>7}'.format(random.randint(1,10000)) for i in range(1000000)]

In [12]: %timeit lst == sorted(lst,key=str.lower)
1 loops, best of 3: 1.08 s per loop

In [13]: %timeit all(lst[i].lower() < lst[i+1].lower() for i in range(len(lst)-1))
The slowest run took 6.20 times longer than the fastest. This could mean that an intermediate result is being cached
100000 loops, best of 3: 2.89 µs per loop
Run Code Online (Sandbox Code Playgroud)

结果 -

对于应该返回的情况True(已经是已排序的列表),使用sorted()速度非常快all(),因为sorted()适用于大多数排序的列表.

对于随机的情况,all()效果比sorted()由于all()它的短路特性(当它看到第一个时它会短路)更好False.

此外,有一个事实是sorted()在内存中创建一个临时(排序列表)(用于比较),all()而不需要(并且这个事实确实归因于我们上面看到的时间).


早期的答案直接(并且只适用于这个问题)你可以简单地直接比较字符串,你不需要字母表的另一个字符串/列表.示例 -

first = (input('Enter first word: '))
second = (input('Enter second word: '))
third = (input('Enter third word: '))
if first <= second <= third:
    print(True)
Run Code Online (Sandbox Code Playgroud)

或者如果你只想比较第一个字符(虽然我非常怀疑) -

if first[0] <= second[0] <= third[0]:
    print(True)
Run Code Online (Sandbox Code Playgroud)

要比较不区分大小写的字符串,可以在比较之前将所有字符串转换为小写.示例 -

if first.lower() <= second.lower() <= third.lower():
    print(True)
Run Code Online (Sandbox Code Playgroud)

或者更简单 -

print(first.lower() <= second.lower() <= third.lower())
Run Code Online (Sandbox Code Playgroud)


vau*_*tah 6

是的,列表没有find方法.虽然你甚至不必使用列表.的<=(以及>=)算字典顺序比较序列.此外,Python支持链式比较.这是我写的方式:

first = input('Enter first word: ')
second = input('Enter second word: ')
third = input('Enter third word: ')
print(first <= second <= third)
Run Code Online (Sandbox Code Playgroud)

如果有超过3个单词,则将它们收集到列表中,对其进行排序并将其与源列表进行比较.例:

words = input('Enter words (separated by whitespace): ').split()
print(sorted(words) == words) # True if sorted() didn't re-order anything
Run Code Online (Sandbox Code Playgroud)

对于少量单词,这两种方法都可以很好地工作.如果字数很大,则应考虑使用内置all函数和生成器表达式的短路解决方案:

prev_it, cur_it = iter(words), iter(words)
# Consume first element
next(cur_it)
# Pairwise iteration
print(all(prev <= cur for prev, cur in zip(prev_it, cur_it)))
Run Code Online (Sandbox Code Playgroud)

这是第一种解决方案的有效概括.


如果要执行不区分大小写的比较,请使用str.lower(或str.casefold在Python 3.3+中).

第一个代码段的示例:

print(first.lower() <= second.lower() <= third.lower())
Run Code Online (Sandbox Code Playgroud)

基于列表的方法示例:

words = [s.lower() for s in input('Enter words (separated by whitespace): ').split()]
Run Code Online (Sandbox Code Playgroud)