来自用户输入的笛卡尔积-获取字符串而不是列表



我正在做一个分配,我部分在那里,但坚持如何获得输出作为一个单一的列表与字符串。显然,我正在学习,所以善意的帮助或建议是感激的!

下面是赋值:计算它们的笛卡尔积,两个列表的AxB。每个列表不超过10个数字。

例如,如果用户提供了两个输入列表:A = [1,2]B = [3,4]

则笛卡尔积输出应为:AxB = [(1,3),(1,4),(2,3),(2,4)]

这是我到目前为止写的:

import itertools
input_A = []
input_B = []
input_A = input('Enter first 2 - 10 characters: ')
input_B = input('Enter second 2 - 10 characters: ')
for combination in itertools.product(input_A, input_B):
print('AxB = ', [combination])

下面是我的输出:

Enter first 2 - 10 characters: 12 #I don't get the the below output when using comma separated items
Enter second 2 - 10 characters: 34
AxB =  [('1', '3')]
AxB =  [('1', '4')]
AxB =  [('2', '3')]
AxB =  [('2', '4')]

如下:

import itertools
input_A = list(map(int, input("Enter multiple numbers for first list separated by commas: ").split(",")))
input_B = list(map(int, input("Enter multiple numbers for second list separated by commas: ").split(",")))
result = list(itertools.product(input_A, input_B))
print(f'A x B = {result}')
#output:
#Enter multiple numbers for first list separated by commas: 3,5,7
#Enter multiple numbers for second list separated by commas: 2,4
#A x B = [(3, 2), (3, 4), (5, 2), (5, 4), (7, 2), (7, 4)]

如果您希望在用户输入非数值时捕获异常,并继续提示用户输入正确的值,您可以这样做:

import itertools
while True:
try:
input_A = list(map(int, input("Enter multiple numbers for first list separated by commas: ").split(",")))
input_B = list(map(int, input("Enter multiple numbers for second list separated by commas: ").split(",")))
result = list(itertools.product(input_A, input_B))
break
except ValueError:
print("Wrong input. Start over!")
print(f'A x B = {result}')

既然不能使用itertools,那么让我们构建一个函数来计算两个集合AB的笛卡尔积。我假设脚本的用户输入部分正常工作。

我假设你不打算做任何形式的重复删除(技术上,笛卡尔积是在两个集合上执行的,或者是唯一对象的集合,但由于你是在做用户输入,用户可能会给出一个有重复项的列表,而指令中没有任何关于处理这个的说明)。

作为一个小例子,设A = {0, 1, 2}B = {3, 4, 5}。那么笛卡尔积是

{(0, 3), (0, 4), (0, 5), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5)}

注意,从左到右,每个元组的第一个元素似乎不经常改变。生成这个元组列表的系统方法是首先从A中获取一个元素,然后"修复"这个元素。当您从B中取出每个元素并对它们进行配对时,它将就位。在伪代码中:

take 0 from A
take 3 from B  ->  (0, 3)
take 4 from B  ->  (0, 4)
take 5 from B  ->  (0, 5)
no more elements in B
take 1 from A
take 3 from B  ->  (1, 3)
take 4 from B  ->  (1, 4)
.
.
.

或者更简洁地说:for each item in A, pair it with an element from B.

在Python中:

>>> for a in A:
...    for b in B:
...        print(f"({a}, {b})")
...
(0, 3)
(0, 4)
(0, 5)
(1, 3)
(1, 4)
(1, 5)
(2, 3)
(2, 4)
(2, 5)

我让你把最后一部分放进去(以某种方式得到你的结果,因为所有这些代码都是在每次迭代中打印ab的值)。

所以我想我明白了(只要你在用户输入中不使用逗号或空格!)这是必须的,教授无论如何都会记下他不喜欢的东西所以这就是我要做的。感谢每个抛出想法的人,我显然需要离开它一天,以便能够更清楚地看到它。

def cartesian(list_A, list_B):
AxB = [ ]
for A in list_A:
for B in list_B:
AxB.append((A,B))
print('AxB =  ', AxB)
list_A = input('Enter up to 10 numbers for List A: ')
list_B = input('Enter up to 10 numbers for List B: ')
cartesian(list_A, list_B)

输出:

Enter up to 10 numbers for List A: 12
Enter up to 10 numbers for List B: 34
AxB =   [('1', '3'), ('1', '4'), ('2', '3'), ('2', '4')]

相关内容

  • 没有找到相关文章

最新更新