- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有 2 个不同长度的列表,例如:
list_a = ['a', 'b', 'c', 'd']
list_b = ['x', 'y']
我想要的输出是list_b到list_a的所有唯一组合,例如应该有16个:
1. ['a', 'x', 'y']
2. [['a', 'x'], ['b', 'y']]
3. [['a', 'x'], ['c', 'y']]
4. [['a', 'x'], ['d', 'y']]
5. ['b', 'x', 'y']
6. [['b', 'x'], ['a', 'y']]
7. [['b', 'x'], ['c', 'y']]
8. [['b', 'x'], ['d', 'y']]
9. ['c', 'x', 'y']
10. [['c', 'x'], ['a', 'y']]
11. [['c', 'x'], ['b', 'y']]
12. [['c', 'x'], ['d', 'y']]
13. ['d', 'x', 'y']
14. [['d', 'x'], ['a', 'y']]
15. [['d', 'x'], ['b', 'y']]
16. [['d', 'x'], ['c', 'y']]
我对总列表数量的猜测是 len(list_a) ** len(list_b),所以我知道选项空间很快就会变得非常大。
关于在 Python 中执行此操作的有效方法的任何建议(避免生成过多的排列和测试重复项等)/
我在许多不同的列表类型和构成上使用了 itertools 产品、排列和组合。我可以通过使用循环查找所有答案来生成所需的答案,其中每个 list_a 有来自 list_b 的 2 个条目(即上面的 1、5、9、13),然后找到每个 list_a 有来自 list_b 的 1 个条目的所有组合,但是此方法一旦 len(list_b) > 2 就会掉落。
编辑:这是一个源/汇问题。 list_b 是所有需要完全使用的接收器,list_a 是可以向接收器提供输入的源。即,对于上述问题,所有 3 个接收器都可以由单个源提供服务(示例 1、5、9、13),或者可以通过多种方式拆分 1 个源 -> 2 个接收器,或 1:1 - I'我试图找到所有这些方法
最佳答案
您似乎想要一个从 list_b
到 list_a
的所有函数的列表,但您希望每个函数都以特定的形式表示列表形式而不是通常的 dict 形式或有序对形式。 “函数”这个词比“组合”这个词更适合这里。
您的函数格式有两个特点。首先,示例所需输出中的大多数行都是列表的列表。但是,如果所表示的函数将图像(list_a
中的结果项)仅作为 list_a
的一个元素,那么您将获得一个列表,而不是列表的列表。这在您的示例中有效,其中 list_b
中只有两项,因此函数的范围是 list_a
中的一项或所有项目。但是,如果 list_b
较大,则可能会出现范围既不是 list_a
中的一项也不是所有项的情况,并且您对该行所需的结果不清楚。
其次,您的行的顺序与此类事物的通常顺序并不最佳匹配。
这里的代码给出了所有行的列表列表,并且顺序与您给出的顺序略有不同。基本思想是通过按固定顺序排列域 list_b
中的项目来获得一个函数,由于数据结构是一个列表,所以这已经完成了。然后获取list_a
的product(在itertools意义上),使用repeat=len(list_b)
,这样product中的第一项是list_b
中第一项的函数结果,依此类推。例程的其余部分将此定义的函数转换为其反函数的字典形式,该函数将每个结果项与映射到它的所有域项分组,然后将其转换为您显示的列表格式。
from itertools import product
from collections import defaultdict
def functions_as_lists(tolist, fromlist):
"""Return a list of functions from fromlist to tolist where each
function is represented as a list of lists.
"""
result = []
for toitems in product(tolist, repeat=len(fromlist)):
# Convert a tuple to a function represented as a dict
afunction = defaultdict(list)
for toitem, fromitem in zip(toitems, fromlist):
afunction[toitem].append(fromitem)
# Convert the dict-function to the desired list of lists
alist = [[toitem] + fromitems
for toitem, fromitems in afunction.items()]
# Store that list form of the function
result.append(alist)
return result
for item in functions_as_lists(['a', 'b', 'c', 'd'], ['x', 'y']):
print(item)
输出是:
[['a', 'x', 'y']]
[['a', 'x'], ['b', 'y']]
[['a', 'x'], ['c', 'y']]
[['a', 'x'], ['d', 'y']]
[['b', 'x'], ['a', 'y']]
[['b', 'x', 'y']]
[['b', 'x'], ['c', 'y']]
[['b', 'x'], ['d', 'y']]
[['c', 'x'], ['a', 'y']]
[['c', 'x'], ['b', 'y']]
[['c', 'x', 'y']]
[['c', 'x'], ['d', 'y']]
[['d', 'x'], ['a', 'y']]
[['d', 'x'], ['b', 'y']]
[['d', 'x'], ['c', 'y']]
[['d', 'x', 'y']]
我的代码使用 defaultdict
,它在 CPython 3.7 中保留顺序。在其他发行版中可能并非如此,因此我的代码可能会导致与上面的输出稍有不同的行。 Python 3.6 及更高版本中更复杂的代码可以使用常规的 dict
而不是 defaultdict
来解决这个问题。
注意:如果您确实希望第一行是 ['a', 'x', 'y']
而不是 [['a', 'x', ' y']]
,您可以在定义变量 alist
的行后面添加这两行:
if len(alist) == 1:
alist = alist[0]
但这可能不是您想要的 list_a
较长值。
关于python - 在Python中生成特定的列表组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57192675/
如标题所示,ans_list是一个答案列表,ans_index是一个数字(答案在词汇表中的索引,但与atm无关) 这里生成的 tree.anslist 是什么? (例如,仅针对第一个),忽略迭代。 f
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将具有一个元素的东西拿走。 这与 How do I “flatte
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将带有一个元素的东西拿走。 这与 How do I “flatte
这个问题已经有答案了: Convert nested list to 2d array (3 个回答) 已关闭 7 年前。 java中有没有快捷方式可以转换 List> 到 String[][] ?
我在排序时遇到问题 List> 。我创建了一个自定义比较器,在其中编写了对数据进行排序的代码。 public class CustomComparator implements Comparator
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Java Generics: Cannot cast List to List? 我只是想知道为什么下面的java代
试图想出一个 LINQy 方法来做到这一点,但我什么也没想到。 我有一个对象列表<>,其中包含一个属性,该属性是逗号分隔的字母代码列表: lst[0].codes = "AA,BB,DD" lst[1
假设我有这些任务: points = [] point = (1, 2) 我怎么会这样做: points += point 它工作得很好,并且给了我点 = [1, 2]。但是,如果我这样做: poin
如何在 scala 中将 List[Task[List[Header]]] 类型转换为 Task[List[Header]]。 我有一个方法返回 Task[List[Header]] 并多次调用 do
如何在 Java 中查找二维列表的元素? 我有一个参数为 List> 的函数我想知道如何找到这个列表的行和列。 最佳答案 如果你喜欢 List> obj 然后你就可以像这样访问 obj.get(cur
分配 List到 List工作正常。 分配 List>到 List>不编译。 代码 public class Main { public static void main(String[] a
我正在用 Java 编写一个方法,该方法必须接收并迭代 Serializable 的 List。 有什么区别: public void myMethod(List list) { } 和 public
我看到很多人想用 mvvm 更新网格/列表/树的一部分,但他们不想刷新整个列表。 对于所有遇到此问题的人,我做了以下示例。 希望这对你有用。 最佳答案 这是一个简单的例子。整个代码中最重要的是: Bi
我正在为现有的 C++ 库编写包装器,该库使用列表,其中 T 是自定义结构。我被建议使用 vector 而不是列表,但我试图避免修改库。 为了更好地理解这个场景,我做了一个简单的应用程序,使用一个列表
List list List list 这两种声明有什么区别吗? 谢谢, 最佳答案 是的。 List可以包含所有派生自 Base 的不同事物的混合物. List包含同质项(从某种意义上说,它们必须全部
有人可以尽可能详细地解释以下类型之间的区别吗? List List List 让我更具体一点。我什么时候想使用 // 1 public void CanYouGiveMeAnAnswer(List l
我有一个元组列表,每个元组都是一对列表。所以我的数据看起来像: mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', '
也许是一个时髦的标题,但我遇到了以下问题: 给定一个类型为 (a * b) list 的列表,我想创建一个类型为 (a * b list) list 的新列表。一个例子: 给定列表 let testL
我是一名优秀的程序员,十分优秀!